Support Extra Mouse Buttons in Shortcuts
Needs RevisionPublic

Authored by zanny on Dec 25 2018, 6:06 AM.

Details

Reviewers
dkazakov
Group Reviewers
Krita
Summary

Qt::MouseButton supports up to 24 extra buttons Krita currently doesn't recognize. These are found on gaming mice and some tablets will default their device buttons into that range. Its also more convenient to remap a tablet that exposes mousebuttons into ExtraButtons instead of depending on a mapping program to convert mouse buttons into key events (which is a bit lacking in availability on Wayland or in the libinput tablet driver).

This diff fixes two spelling mistakes and introduces some macros to support all the MouseButtons Qt provides (copy pasting ExtraButtonN 21 times would be a bit tedious).

Fixes BUG: 386202

There is at least one outstanding issue to be rectified before this could be merged - this breaks KisStrokeShortcut::priority by having buttonscore take up 24 bits because the buttons are all bitflags. You can't really make it just take buttons by number (1-24) because the code is meant to avoid priority ties by masking the buttons in the shortcut.

That being said, you can already cause a tie by having two shortcuts for the same action with the same buttons and the same number of modifiers. Reading through the revision history this has been revised several times. So maybe avoiding ties isn't that important if we just used the buttons by number or used the count of buttons since it would still take some effort to cause ties.

Diff Detail

Lint
Lint Skipped
Unit
Unit Tests Skipped
zanny created this revision.Dec 25 2018, 6:06 AM
Restricted Application added a reviewer: Krita. · View Herald TranscriptDec 25 2018, 6:06 AM
zanny requested review of this revision.Dec 25 2018, 6:06 AM

Hi, @zanny!

Thank you for the patch, I'll test it now!

Btw, do you have a commit access to KDE repositories or we will have to push the patch for you?

libs/ui/input/kis_abstract_input_action.h
171

This part was intentional. It means if and only if :)
https://en.wikipedia.org/wiki/If_and_only_if

dkazakov requested changes to this revision.Dec 25 2018, 7:42 AM

Hi, @zanny!

The patch looks good codewise. I especially like the boost's macros for doing all the boilerplate.

Though the patch has some technical problems. I used the following algorithm for testing:

  1. Remap the buttons of my mouse to some random numbers:
xinput set-button-map 11 1 12 13 14 15 16 # where 11 was an ID of my mouse
  1. Assign right button click to Tool Invocation->Activate Line Tool

After that I have two bugs:

  1. BUG1: using line tool for that button doesn't work. It draws a short piece of line, then stops.
  2. BUG2: the shortcut is not saved into the configuration file correctly. After I reopen the configuration page, the box says that my action is mapped to several different buttons.

Concerning the priority problem, see my inline comment

libs/ui/input/kis_stroke_shortcut.cpp
49

Just use logarithm-base-2 instead of raw number. You can also use DeBruijn32 algorithm for that if you like :)

https://stackoverflow.com/questions/2589096/find-most-significant-bit-left-most-that-is-set-in-a-bit-array

This revision now requires changes to proceed.Dec 25 2018, 7:42 AM
yurchor added inline comments.
libs/ui/input/kis_shortcut_configuration.cpp
239

i18nc() does not work this way. It would be better i18nc("Mouse Button", "Mouse %1", BOOST_PP_STRINGIZE(BOOST_PP_ADD(n, 3)).

Thanks in advance for fixing this.

zanny updated this revision to Diff 48214.EditedDec 26 2018, 3:00 AM

Working on button handling on Christmas, I feel like such a dork, but the family already left!

@dkazakov I found out what caused the profile bug, KisShortcutConfiguration::serialize was encoding everything as hex while it was decoding only keys as hex and everything else as dec. It was not a problem only so long as all the other values stayed in the 1-9 range. So serialization was working but deser was reading mouse button 0x40 as decimal. And no, I don't have repo access, y'all get to merge this when baked.

Went with std::log2 in KisStrokeShortcut::priority to not overcomplicate the code or make it break if int is ever not 32 bits. Like I said, this makes it more likely to have priority collisions when button combos are equal to a lower priority single button.

Also redid the text formatting in the shortcut config macro. The STRINGIZE part was just to avoid runtime formatting. Was considering "%1%2 Mouse Button" so it would show up as, say, 12th Mouse Button, but I'm not sure i18n would appreciate having ordinality as a macro parameter so I kept it "Mouse %1 Button".

Digging into whatever is causing the buttons to stop working. I'm willing to bet its related to the size of the button ints somewhere. If I bind a button to pan and hold it down it eventually never gets released after some amount of button events are generated.

zanny marked 2 inline comments as done.Dec 26 2018, 3:05 AM
dkazakov requested changes to this revision.Dec 28 2018, 11:43 AM

Hi, @zanny!

There are two issues with the current version of the patch:

  1. The priority of the actions is messed up, therefore Krita thinks that "Pan" action is ready and shows hand cursor all the time. See my inlined commend for a possible solution.
  2. I still cannot paint with line action, when assigning it to a custom button. See attached screen recording.

libs/ui/input/kis_stroke_shortcut.cpp
54

I guess this is the reason of the cursor bug. Logarithm is not linear relative to its argument, so you should calculate it separately: for the max value and for the currentbutton's one:

const int maxScore = std::log(Qt::MaxMouseButton);
// ...
buttonScore += maxScore - std::log2(button);

I guess this will solve the cursor issue

This revision now requires changes to proceed.Dec 28 2018, 11:43 AM
zanny updated this revision to Diff 48414.Dec 30 2018, 7:27 PM

Cleaned up the priority and traced all the way from KisShortcutConfiguration::deserialize to KisToolPaint::mousePressEvent looking for why tool actions would fail with ExtraButtons. The buttons always register - if I turn on krita.input logging buttons are recognized and tools are run properly but nothing would happen.

So I made a new reset input profile and setup the buttons again and... it worked. I can't verify it now that all the profiles were overridden, but I wouldn't be surprised if the old broken deserialized buttons were being saved when I was tinkering with it making bogus buttons that were putting action readystates in the mess already described and breaking the tools. Heres a video on my end of high order buttons working with tool invocations.

Also fixed some grammar in more files while I was reading them for consistency and spelling.

dkazakov requested changes to this revision.Jan 8 2019, 9:59 AM

Hi, @zanny!

There is still some weird problem with assigning these extra buttons to the shortcuts. Please see the attached video:

Basically, when clicking with a custom shortcut, the action is started, but as soon as the first MouseMove event arrives, the action is terminated :(

PS:
I have reset the config before testing the patch.

PPS:
Saving the buttons to the config seems to work.

This revision now requires changes to proceed.Jan 8 2019, 9:59 AM
zanny added a comment.Jan 8 2019, 9:44 PM

Basically, when clicking with a custom shortcut, the action is started, but as soon as the first MouseMove event arrives, the action is terminated :(

Can you run it with krita.input logging turned on and paste the results? I cannot reproduce this anymore - tried a full clean rebuild on the latest commits today and two different mice that I have. Tried tablet and mouse buttons from 1-2 to 24-25. I want to think it might be a bug with your mouse driver, it might be generating static input events even with xinput override or something. Are you on a trackpad?

Hi, @zanny!

Here is the full tablet log for exactly two strokes. The first one with the normal "left" button, the next one with the overridden "Mouse 12 Button". It behaved exactly as in the video above. It dropped the stroke right after the start. From the log it looks like "Mouse Move" events do not have proper "buttons" field set. Therefore it recognizes teh button as being released.

1krita.tabletlog: vvvvvvvvvvvvvvvvvvvvvvv START TABLET EVENT LOG vvvvvvvvvvvvvvvvvvvvvvv
2krita.tabletlog: "[ ] Enter "
3krita.tabletlog: "[ ] FocusIn "
4krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 487, 139 gpos: 799, 407 hires: 799, 407 Source:0"
5krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 487, 138 gpos: 799, 406 hires: 799, 406 Source:0"
6krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 489, 138 gpos: 801, 406 hires: 801, 406 Source:0"
7krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 491, 137 gpos: 803, 405 hires: 803, 405 Source:0"
8krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 494, 136 gpos: 806, 404 hires: 806, 404 Source:0"
9krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 496, 134 gpos: 808, 402 hires: 808, 402 Source:0"
10krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 498, 133 gpos: 810, 401 hires: 810, 401 Source:0"
11krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 500, 132 gpos: 812, 400 hires: 812, 400 Source:0"
12krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 502, 130 gpos: 814, 398 hires: 814, 398 Source:0"
13krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 503, 129 gpos: 815, 397 hires: 815, 397 Source:0"
14krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 503, 128 gpos: 815, 396 hires: 815, 396 Source:0"
15krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 504, 127 gpos: 816, 395 hires: 816, 395 Source:0"
16krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 505, 127 gpos: 817, 395 hires: 817, 395 Source:0"
17krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 505, 126 gpos: 817, 394 hires: 817, 394 Source:0"
18krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 505, 125 gpos: 817, 393 hires: 817, 393 Source:0"
19krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 506, 125 gpos: 818, 393 hires: 818, 393 Source:0"
20krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 507, 125 gpos: 819, 393 hires: 819, 393 Source:0"
21krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 508, 125 gpos: 820, 393 hires: 820, 393 Source:0"
22krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 509, 124 gpos: 821, 392 hires: 821, 392 Source:0"
23krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 510, 123 gpos: 822, 391 hires: 822, 391 Source:0"
24krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 511, 123 gpos: 823, 391 hires: 823, 391 Source:0"
25krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 511, 122 gpos: 823, 390 hires: 823, 390 Source:0"
26krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 512, 122 gpos: 824, 390 hires: 824, 390 Source:0"
27krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 512, 121 gpos: 824, 389 hires: 824, 389 Source:0"
28krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 513, 121 gpos: 825, 389 hires: 825, 389 Source:0"
29krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 514, 121 gpos: 826, 389 hires: 826, 389 Source:0"
30krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 514, 120 gpos: 826, 388 hires: 826, 388 Source:0"
31krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 515, 120 gpos: 827, 388 hires: 827, 388 Source:0"
32krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 516, 120 gpos: 828, 388 hires: 828, 388 Source:0"
33krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 517, 119 gpos: 829, 387 hires: 829, 387 Source:0"
34krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 519, 118 gpos: 831, 386 hires: 831, 386 Source:0"
35krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 520, 117 gpos: 832, 385 hires: 832, 385 Source:0"
36krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 522, 116 gpos: 834, 384 hires: 834, 384 Source:0"
37krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 523, 116 gpos: 835, 384 hires: 835, 384 Source:0"
38krita.tabletlog: "[ ] MouseButtonPress btn: 1 btns: 1 pos: 523, 116 gpos: 835, 384 hires: 835, 384 Source:0"
39krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 117 gpos: 835, 385 hires: 835, 385 Source:0"
40krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 120 gpos: 835, 388 hires: 835, 388 Source:0"
41krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 123 gpos: 835, 391 hires: 835, 391 Source:0"
42krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 125 gpos: 835, 393 hires: 835, 393 Source:0"
43krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 127 gpos: 835, 395 hires: 835, 395 Source:0"
44krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 130 gpos: 835, 398 hires: 835, 398 Source:0"
45krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 131 gpos: 835, 399 hires: 835, 399 Source:0"
46krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 133 gpos: 835, 401 hires: 835, 401 Source:0"
47krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 135 gpos: 835, 403 hires: 835, 403 Source:0"
48krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 136 gpos: 835, 404 hires: 835, 404 Source:0"
49krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 138 gpos: 835, 406 hires: 835, 406 Source:0"
50krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 139 gpos: 835, 407 hires: 835, 407 Source:0"
51krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 523, 142 gpos: 835, 410 hires: 835, 410 Source:0"
52krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 522, 144 gpos: 834, 412 hires: 834, 412 Source:0"
53krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 522, 145 gpos: 834, 413 hires: 834, 413 Source:0"
54krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 522, 146 gpos: 834, 414 hires: 834, 414 Source:0"
55krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 522, 147 gpos: 834, 415 hires: 834, 415 Source:0"
56krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 522, 148 gpos: 834, 416 hires: 834, 416 Source:0"
57krita.tabletlog: "[ ] MouseMove btn: 0 btns: 1 pos: 522, 149 gpos: 834, 417 hires: 834, 417 Source:0"
58krita.tabletlog: "[ ] MouseButtonReleasebtn: 1 btns: 0 pos: 522, 149 gpos: 834, 417 hires: 834, 417 Source:0"
59krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 521, 149 gpos: 833, 417 hires: 833, 417 Source:0"
60krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 518, 149 gpos: 830, 417 hires: 830, 417 Source:0"
61krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 504, 149 gpos: 816, 417 hires: 816, 417 Source:0"
62krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 499, 149 gpos: 811, 417 hires: 811, 417 Source:0"
63krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 495, 150 gpos: 807, 418 hires: 807, 418 Source:0"
64krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 491, 150 gpos: 803, 418 hires: 803, 418 Source:0"
65krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 489, 150 gpos: 801, 418 hires: 801, 418 Source:0"
66krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 487, 150 gpos: 799, 418 hires: 799, 418 Source:0"
67krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 486, 150 gpos: 798, 418 hires: 798, 418 Source:0"
68krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 485, 150 gpos: 797, 418 hires: 797, 418 Source:0"
69krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 484, 150 gpos: 796, 418 hires: 796, 418 Source:0"
70krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 483, 150 gpos: 795, 418 hires: 795, 418 Source:0"
71krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 482, 149 gpos: 794, 417 hires: 794, 417 Source:0"
72krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 482, 148 gpos: 794, 416 hires: 794, 416 Source:0"
73krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 482, 146 gpos: 794, 414 hires: 794, 414 Source:0"
74krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 481, 145 gpos: 793, 413 hires: 793, 413 Source:0"
75krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 481, 144 gpos: 793, 412 hires: 793, 412 Source:0"
76krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 481, 143 gpos: 793, 411 hires: 793, 411 Source:0"
77krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 481, 142 gpos: 793, 410 hires: 793, 410 Source:0"
78krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 481, 140 gpos: 793, 408 hires: 793, 408 Source:0"
79krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 481, 139 gpos: 793, 407 hires: 793, 407 Source:0"
80krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 480, 137 gpos: 792, 405 hires: 792, 405 Source:0"
81krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 480, 135 gpos: 792, 403 hires: 792, 403 Source:0"
82krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 480, 133 gpos: 792, 401 hires: 792, 401 Source:0"
83krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 480, 131 gpos: 792, 399 hires: 792, 399 Source:0"
84krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 480, 129 gpos: 792, 397 hires: 792, 397 Source:0"
85krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 479, 128 gpos: 791, 396 hires: 791, 396 Source:0"
86krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 479, 127 gpos: 791, 395 hires: 791, 395 Source:0"
87krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 479, 125 gpos: 791, 393 hires: 791, 393 Source:0"
88krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 479, 124 gpos: 791, 392 hires: 791, 392 Source:0"
89krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 479, 123 gpos: 791, 391 hires: 791, 391 Source:0"
90krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 479, 122 gpos: 791, 390 hires: 791, 390 Source:0"
91krita.tabletlog: "[ ] MouseButtonPress btn: 128 btns: 128 pos: 479, 122 gpos: 791, 390 hires: 791, 390 Source:0"
92krita.tabletlog: "[ ] MouseMove btn: 0 btns: 128 pos: 479, 123 gpos: 791, 391 hires: 791, 391 Source:0"
93krita.tabletlog: "[ ] MouseButtonReleasebtn: 128 btns: 0 pos: 479, 123 gpos: 791, 391 hires: 791, 391 Source:0"
94krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 479, 124 gpos: 791, 392 hires: 791, 392 Source:0"
95krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 478, 126 gpos: 790, 394 hires: 790, 394 Source:0"
96krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 478, 128 gpos: 790, 396 hires: 790, 396 Source:0"
97krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 477, 131 gpos: 789, 399 hires: 789, 399 Source:0"
98krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 475, 134 gpos: 787, 402 hires: 787, 402 Source:0"
99krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 475, 136 gpos: 787, 404 hires: 787, 404 Source:0"
100krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 474, 139 gpos: 786, 407 hires: 786, 407 Source:0"
101krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 474, 140 gpos: 786, 408 hires: 786, 408 Source:0"
102krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 474, 142 gpos: 786, 410 hires: 786, 410 Source:0"
103krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 474, 144 gpos: 786, 412 hires: 786, 412 Source:0"
104krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 474, 145 gpos: 786, 413 hires: 786, 413 Source:0"
105krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 474, 146 gpos: 786, 414 hires: 786, 414 Source:0"
106krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 474, 147 gpos: 786, 415 hires: 786, 415 Source:0"
107krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 474, 148 gpos: 786, 416 hires: 786, 416 Source:0"
108krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 474, 149 gpos: 786, 417 hires: 786, 417 Source:0"
109krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 473, 151 gpos: 785, 419 hires: 785, 419 Source:0"
110krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 473, 152 gpos: 785, 420 hires: 785, 420 Source:0"
111krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 473, 153 gpos: 785, 421 hires: 785, 421 Source:0"
112krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 472, 155 gpos: 784, 423 hires: 784, 423 Source:0"
113krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 472, 156 gpos: 784, 424 hires: 784, 424 Source:0"
114krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 472, 157 gpos: 784, 425 hires: 784, 425 Source:0"
115krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 472, 158 gpos: 784, 426 hires: 784, 426 Source:0"
116krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 472, 160 gpos: 784, 428 hires: 784, 428 Source:0"
117krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 472, 161 gpos: 784, 429 hires: 784, 429 Source:0"
118krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 472, 163 gpos: 784, 431 hires: 784, 431 Source:0"
119krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 471, 164 gpos: 783, 432 hires: 783, 432 Source:0"
120krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 471, 165 gpos: 783, 433 hires: 783, 433 Source:0"
121krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 470, 166 gpos: 782, 434 hires: 782, 434 Source:0"
122krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 470, 167 gpos: 782, 435 hires: 782, 435 Source:0"
123krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 470, 168 gpos: 782, 436 hires: 782, 436 Source:0"
124krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 469, 168 gpos: 781, 436 hires: 781, 436 Source:0"
125krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 469, 169 gpos: 781, 437 hires: 781, 437 Source:0"
126krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 469, 171 gpos: 781, 439 hires: 781, 439 Source:0"
127krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 468, 172 gpos: 780, 440 hires: 780, 440 Source:0"
128krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 468, 174 gpos: 780, 442 hires: 780, 442 Source:0"
129krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 467, 175 gpos: 779, 443 hires: 779, 443 Source:0"
130krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 467, 177 gpos: 779, 445 hires: 779, 445 Source:0"
131krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 466, 178 gpos: 778, 446 hires: 778, 446 Source:0"
132krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 466, 179 gpos: 778, 447 hires: 778, 447 Source:0"
133krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 466, 180 gpos: 778, 448 hires: 778, 448 Source:0"
134krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 465, 181 gpos: 777, 449 hires: 777, 449 Source:0"
135krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 465, 182 gpos: 777, 450 hires: 777, 450 Source:0"
136krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 465, 183 gpos: 777, 451 hires: 777, 451 Source:0"
137krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 465, 185 gpos: 777, 453 hires: 777, 453 Source:0"
138krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 464, 186 gpos: 776, 454 hires: 776, 454 Source:0"
139krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 464, 188 gpos: 776, 456 hires: 776, 456 Source:0"
140krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 463, 189 gpos: 775, 457 hires: 775, 457 Source:0"
141krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 463, 190 gpos: 775, 458 hires: 775, 458 Source:0"
142krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 462, 191 gpos: 774, 459 hires: 774, 459 Source:0"
143krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 462, 192 gpos: 774, 460 hires: 774, 460 Source:0"
144krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 462, 193 gpos: 774, 461 hires: 774, 461 Source:0"
145krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 461, 194 gpos: 773, 462 hires: 773, 462 Source:0"
146krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 461, 195 gpos: 773, 463 hires: 773, 463 Source:0"
147krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 461, 196 gpos: 773, 464 hires: 773, 464 Source:0"
148krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 460, 197 gpos: 772, 465 hires: 772, 465 Source:0"
149krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 460, 198 gpos: 772, 466 hires: 772, 466 Source:0"
150krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 459, 199 gpos: 771, 467 hires: 771, 467 Source:0"
151krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 459, 200 gpos: 771, 468 hires: 771, 468 Source:0"
152krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 459, 201 gpos: 771, 469 hires: 771, 469 Source:0"
153krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 458, 202 gpos: 770, 470 hires: 770, 470 Source:0"
154krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 458, 203 gpos: 770, 471 hires: 770, 471 Source:0"
155krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 457, 204 gpos: 769, 472 hires: 769, 472 Source:0"
156krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 456, 206 gpos: 768, 474 hires: 768, 474 Source:0"
157krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 456, 207 gpos: 768, 475 hires: 768, 475 Source:0"
158krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 455, 209 gpos: 767, 477 hires: 767, 477 Source:0"
159krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 455, 210 gpos: 767, 478 hires: 767, 478 Source:0"
160krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 454, 211 gpos: 766, 479 hires: 766, 479 Source:0"
161krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 454, 212 gpos: 766, 480 hires: 766, 480 Source:0"
162krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 454, 213 gpos: 766, 481 hires: 766, 481 Source:0"
163krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 453, 214 gpos: 765, 482 hires: 765, 482 Source:0"
164krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 452, 216 gpos: 764, 484 hires: 764, 484 Source:0"
165krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 452, 217 gpos: 764, 485 hires: 764, 485 Source:0"
166krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 451, 218 gpos: 763, 486 hires: 763, 486 Source:0"
167krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 450, 219 gpos: 762, 487 hires: 762, 487 Source:0"
168krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 450, 220 gpos: 762, 488 hires: 762, 488 Source:0"
169krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 449, 221 gpos: 761, 489 hires: 761, 489 Source:0"
170krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 448, 222 gpos: 760, 490 hires: 760, 490 Source:0"
171krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 448, 223 gpos: 760, 491 hires: 760, 491 Source:0"
172krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 446, 225 gpos: 758, 493 hires: 758, 493 Source:0"
173krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 446, 226 gpos: 758, 494 hires: 758, 494 Source:0"
174krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 445, 226 gpos: 757, 494 hires: 757, 494 Source:0"
175krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 445, 227 gpos: 757, 495 hires: 757, 495 Source:0"
176krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 444, 228 gpos: 756, 496 hires: 756, 496 Source:0"
177krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 444, 229 gpos: 756, 497 hires: 756, 497 Source:0"
178krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 443, 229 gpos: 755, 497 hires: 755, 497 Source:0"
179krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 443, 230 gpos: 755, 498 hires: 755, 498 Source:0"
180krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 442, 231 gpos: 754, 499 hires: 754, 499 Source:0"
181krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 441, 232 gpos: 753, 500 hires: 753, 500 Source:0"
182krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 440, 233 gpos: 752, 501 hires: 752, 501 Source:0"
183krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 440, 234 gpos: 752, 502 hires: 752, 502 Source:0"
184krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 439, 234 gpos: 751, 502 hires: 751, 502 Source:0"
185krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 439, 235 gpos: 751, 503 hires: 751, 503 Source:0"
186krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 438, 236 gpos: 750, 504 hires: 750, 504 Source:0"
187krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 436, 238 gpos: 748, 506 hires: 748, 506 Source:0"
188krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 435, 239 gpos: 747, 507 hires: 747, 507 Source:0"
189krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 434, 240 gpos: 746, 508 hires: 746, 508 Source:0"
190krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 433, 241 gpos: 745, 509 hires: 745, 509 Source:0"
191krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 432, 242 gpos: 744, 510 hires: 744, 510 Source:0"
192krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 431, 243 gpos: 743, 511 hires: 743, 511 Source:0"
193krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 430, 243 gpos: 742, 511 hires: 742, 511 Source:0"
194krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 429, 244 gpos: 741, 512 hires: 741, 512 Source:0"
195krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 428, 245 gpos: 740, 513 hires: 740, 513 Source:0"
196krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 427, 245 gpos: 739, 513 hires: 739, 513 Source:0"
197krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 426, 246 gpos: 738, 514 hires: 738, 514 Source:0"
198krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 425, 247 gpos: 737, 515 hires: 737, 515 Source:0"
199krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 424, 247 gpos: 736, 515 hires: 736, 515 Source:0"
200krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 423, 248 gpos: 735, 516 hires: 735, 516 Source:0"
201krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 423, 249 gpos: 735, 517 hires: 735, 517 Source:0"
202krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 422, 249 gpos: 734, 517 hires: 734, 517 Source:0"
203krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 421, 250 gpos: 733, 518 hires: 733, 518 Source:0"
204krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 420, 250 gpos: 732, 518 hires: 732, 518 Source:0"
205krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 419, 251 gpos: 731, 519 hires: 731, 519 Source:0"
206krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 418, 251 gpos: 730, 519 hires: 730, 519 Source:0"
207krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 417, 252 gpos: 729, 520 hires: 729, 520 Source:0"
208krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 416, 253 gpos: 728, 521 hires: 728, 521 Source:0"
209krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 414, 254 gpos: 726, 522 hires: 726, 522 Source:0"
210krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 412, 255 gpos: 724, 523 hires: 724, 523 Source:0"
211krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 410, 255 gpos: 722, 523 hires: 722, 523 Source:0"
212krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 407, 255 gpos: 719, 523 hires: 719, 523 Source:0"
213krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 405, 256 gpos: 717, 524 hires: 717, 524 Source:0"
214krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 401, 256 gpos: 713, 524 hires: 713, 524 Source:0"
215krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 399, 257 gpos: 711, 525 hires: 711, 525 Source:0"
216krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 395, 257 gpos: 707, 525 hires: 707, 525 Source:0"
217krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 393, 257 gpos: 705, 525 hires: 705, 525 Source:0"
218krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 389, 257 gpos: 701, 525 hires: 701, 525 Source:0"
219krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 387, 258 gpos: 699, 526 hires: 699, 526 Source:0"
220krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 386, 258 gpos: 698, 526 hires: 698, 526 Source:0"
221krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 383, 258 gpos: 695, 526 hires: 695, 526 Source:0"
222krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 381, 258 gpos: 693, 526 hires: 693, 526 Source:0"
223krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 379, 258 gpos: 691, 526 hires: 691, 526 Source:0"
224krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 376, 258 gpos: 688, 526 hires: 688, 526 Source:0"
225krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 375, 258 gpos: 687, 526 hires: 687, 526 Source:0"
226krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 373, 258 gpos: 685, 526 hires: 685, 526 Source:0"
227krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 372, 258 gpos: 684, 526 hires: 684, 526 Source:0"
228krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 371, 258 gpos: 683, 526 hires: 683, 526 Source:0"
229krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 369, 258 gpos: 681, 526 hires: 681, 526 Source:0"
230krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 367, 258 gpos: 679, 526 hires: 679, 526 Source:0"
231krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 365, 258 gpos: 677, 526 hires: 677, 526 Source:0"
232krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 364, 258 gpos: 676, 526 hires: 676, 526 Source:0"
233krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 363, 258 gpos: 675, 526 hires: 675, 526 Source:0"
234krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 361, 258 gpos: 673, 526 hires: 673, 526 Source:0"
235krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 359, 259 gpos: 671, 527 hires: 671, 527 Source:0"
236krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 358, 259 gpos: 670, 527 hires: 670, 527 Source:0"
237krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 356, 259 gpos: 668, 527 hires: 668, 527 Source:0"
238krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 353, 259 gpos: 665, 527 hires: 665, 527 Source:0"
239krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 352, 259 gpos: 664, 527 hires: 664, 527 Source:0"
240krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 350, 259 gpos: 662, 527 hires: 662, 527 Source:0"
241krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 349, 259 gpos: 661, 527 hires: 661, 527 Source:0"
242krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 348, 259 gpos: 660, 527 hires: 660, 527 Source:0"
243krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 347, 259 gpos: 659, 527 hires: 659, 527 Source:0"
244krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 345, 260 gpos: 657, 528 hires: 657, 528 Source:0"
245krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 344, 260 gpos: 656, 528 hires: 656, 528 Source:0"
246krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 343, 260 gpos: 655, 528 hires: 655, 528 Source:0"
247krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 342, 260 gpos: 654, 528 hires: 654, 528 Source:0"
248krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 341, 260 gpos: 653, 528 hires: 653, 528 Source:0"
249krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 340, 260 gpos: 652, 528 hires: 652, 528 Source:0"
250krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 339, 260 gpos: 651, 528 hires: 651, 528 Source:0"
251krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 338, 260 gpos: 650, 528 hires: 650, 528 Source:0"
252krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 337, 260 gpos: 649, 528 hires: 649, 528 Source:0"
253krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 336, 260 gpos: 648, 528 hires: 648, 528 Source:0"
254krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 335, 260 gpos: 647, 528 hires: 647, 528 Source:0"
255krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 334, 260 gpos: 646, 528 hires: 646, 528 Source:0"
256krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 333, 260 gpos: 645, 528 hires: 645, 528 Source:0"
257krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 332, 260 gpos: 644, 528 hires: 644, 528 Source:0"
258krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 331, 260 gpos: 643, 528 hires: 643, 528 Source:0"
259krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 330, 260 gpos: 642, 528 hires: 642, 528 Source:0"
260krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 327, 260 gpos: 639, 528 hires: 639, 528 Source:0"
261krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 324, 260 gpos: 636, 528 hires: 636, 528 Source:0"
262krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 321, 260 gpos: 633, 528 hires: 633, 528 Source:0"
263krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 317, 260 gpos: 629, 528 hires: 629, 528 Source:0"
264krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 313, 260 gpos: 625, 528 hires: 625, 528 Source:0"
265krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 309, 260 gpos: 621, 528 hires: 621, 528 Source:0"
266krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 306, 260 gpos: 618, 528 hires: 618, 528 Source:0"
267krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 303, 260 gpos: 615, 528 hires: 615, 528 Source:0"
268krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 300, 260 gpos: 612, 528 hires: 612, 528 Source:0"
269krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 296, 260 gpos: 608, 528 hires: 608, 528 Source:0"
270krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 294, 260 gpos: 606, 528 hires: 606, 528 Source:0"
271krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 291, 260 gpos: 603, 528 hires: 603, 528 Source:0"
272krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 289, 260 gpos: 601, 528 hires: 601, 528 Source:0"
273krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 286, 260 gpos: 598, 528 hires: 598, 528 Source:0"
274krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 285, 260 gpos: 597, 528 hires: 597, 528 Source:0"
275krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 284, 261 gpos: 596, 529 hires: 596, 529 Source:0"
276krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 283, 261 gpos: 595, 529 hires: 595, 529 Source:0"
277krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 282, 261 gpos: 594, 529 hires: 594, 529 Source:0"
278krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 281, 261 gpos: 593, 529 hires: 593, 529 Source:0"
279krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 280, 261 gpos: 592, 529 hires: 592, 529 Source:0"
280krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 278, 261 gpos: 590, 529 hires: 590, 529 Source:0"
281krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 276, 261 gpos: 588, 529 hires: 588, 529 Source:0"
282krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 274, 261 gpos: 586, 529 hires: 586, 529 Source:0"
283krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 273, 261 gpos: 585, 529 hires: 585, 529 Source:0"
284krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 272, 261 gpos: 584, 529 hires: 584, 529 Source:0"
285krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 270, 261 gpos: 582, 529 hires: 582, 529 Source:0"
286krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 269, 261 gpos: 581, 529 hires: 581, 529 Source:0"
287krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 268, 261 gpos: 580, 529 hires: 580, 529 Source:0"
288krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 267, 261 gpos: 579, 529 hires: 579, 529 Source:0"
289krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 266, 261 gpos: 578, 529 hires: 578, 529 Source:0"
290krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 265, 261 gpos: 577, 529 hires: 577, 529 Source:0"
291krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 264, 261 gpos: 576, 529 hires: 576, 529 Source:0"
292krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 263, 261 gpos: 575, 529 hires: 575, 529 Source:0"
293krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 262, 261 gpos: 574, 529 hires: 574, 529 Source:0"
294krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 261, 261 gpos: 573, 529 hires: 573, 529 Source:0"
295krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 260, 261 gpos: 572, 529 hires: 572, 529 Source:0"
296krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 259, 261 gpos: 571, 529 hires: 571, 529 Source:0"
297krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 258, 261 gpos: 570, 529 hires: 570, 529 Source:0"
298krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 257, 261 gpos: 569, 529 hires: 569, 529 Source:0"
299krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 256, 261 gpos: 568, 529 hires: 568, 529 Source:0"
300krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 255, 261 gpos: 567, 529 hires: 567, 529 Source:0"
301krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 254, 261 gpos: 566, 529 hires: 566, 529 Source:0"
302krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 253, 261 gpos: 565, 529 hires: 565, 529 Source:0"
303krita.tabletlog: "[ ] MouseMove btn: 0 btns: 0 pos: 252, 261 gpos: 564, 529 hires: 564, 529 Source:0"
304krita.tabletlog: "[ ] ShortcutOverride key: 0x1000021 mod: 0x4000000 text: none"
305krita.tabletlog: "[ ] FocusOut "
306krita.tabletlog: "[ ] Enter "
307krita.tabletlog: "[ ] FocusIn "
308krita.tabletlog: "[ ] ShortcutOverride key: 0x1000020 mod: 0x4000000 text: none"
309krita.tabletlog: "[ ] ShortcutOverride key: 0x1000021 mod: 0x2000000 text: none"
310krita.tabletlog: "[ ] ShortcutOverride key: 0x1000020 mod: 0x6000000 text: none"
311krita.tabletlog: "[ ] FocusOut "
312krita.tabletlog: "[ ] Enter "
313krita.tabletlog: "[ ] FocusIn "
314krita.tabletlog: "[ ] ShortcutOverride key: 0x1000020 mod: 0x4000000 text: none"
315krita.tabletlog: "[ ] ShortcutOverride key: 0x1000021 mod: 0x2000000 text: none"
316krita.tabletlog: "[ ] ShortcutOverride key: 0x54 mod: 0x6000000 text: none"
317krita.tabletlog: "[ ] ShortcutOverride key: 0x54 mod: 0x6000000 text: \u0014"
318krita.tabletlog: ^^^^^^^^^^^^^^^^^^^^^^^ END TABLET EVENT LOG ^^^^^^^^^^^^^^^^^^^^^^^

zanny added a comment.EditedJan 22 2019, 3:27 AM

From the log it looks like "Mouse Move" events do not have proper "buttons" field set. Therefore it recognizes teh button as being released.

@dkazakov

I definitely think we are at a bug in Qt or maybe even higher up the input stack. Here are two logs - the first one is with libinput and four different lines with four different buttons (all using the mouse as the moving pointer device) - left button bound normally (shows as expected), right button bound to button 24 (also works), mouse 1 bound to a button on my tablet (shows btns: 1) and button 12 on the tablet with the mouse which... shows btns: 0, but still works to draw the line. Thought it might be driver related so I used evdev instead for my mouse driver and redid the mouse tests in the second file but the results match the libinput ones so thats out. Note that I'm doing this on X 1.20.3, with libinput 1.12.6, evdev 2.10.6, and Qt 5.12.0 on Arch. If you are on another distribution the stock packages might be built differently somewhere.

I'm going to dig on the side to try to figure out why MouseMove is only dropping high-order buttons from other devices. Depending on your drivers that might be whats causing your events to drop?


Edit: At least on the official Qt docs there are some serious mixed messages about what should be in MouseEvent::buttons. It says it should only be buttons 1 - 3 but also be all buttons down during a move.

Having a dickens of a time trying to track down where MouseEvents are actually spawned in QtCore though. I'd assume it would be in the Qt X11 extensions but I'm not finding anything and I'm pretty sure whatever original XInput handler Qt has predates the X11 module anyway.

Edit 2: Was curious and tried it on Wayland but it seems Krita is using XWayland there (at least in the default build) so I was still using xinput / xevents and the results were the same.

rempt added a subscriber: rempt.Jan 22 2019, 9:02 AM

Yes, Krita cannot use wayland directly.

zanny added a comment.EditedApr 21 2019, 5:55 PM

Since Qt 5.13's beta came out I got around to reading the XCB QT plugin source and nothing is making tablet move events not advertise buttons, so it must be in Xinput itself. Also no patches since 5.12 released that could explain the behavior change. So this patch still works fine on my end with the latest trunk and Qt 5.12 and 5.13. Might be worth noting I'm using libxcb 1.13.1 but thats still from last October.

I did at least deduce that it seems XCB doesn't indicate buttons pressed on tablet pens in general. If I press tablet buttons and move the mouse, it carries the pressed buttons from the tablet device, but tablet move events never have associated buttons. That at least explains the discrepancy from those earlier logs. Is that behavior different for anyone else? If it is its probably further up the input stack in X or Digimend / Wacom.

Could y'all retest, and if it breaks let me know what versions of XCB and Xorg you are running? 44080b7b might have fixed some of the earlier bugs already.