Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
July 2019
- 65 participants
- 633 messages
Another Call for WineConf 2019 presentations
by Aric Stewart
Hello again!
Another call for talks! I have gotten only one single person contacting me. This means right now we have nothing scheduled presentation wise and 10 open slots.
Please send me information if you would like to do a talk! Volunteer your self, Volunteer your friends, Volunteer your dog. Lets get some more on this schedule.
-aric
On 5/29/19 11:39 AM, Aric Stewart wrote:
> Hello,
>
> Again this year I am helping coordinate the talks and presentations! I hope that people find it helpful and useful! Last work worked out well enough that I am sticking to the same rough format. I think it worked for most other people as well!
>
> If you would like to give a presentation! Please e-mail wineconf(a)winehq.org or me directly! I will keep the Wiki updated with presentations and scheduling as we get it worked out.
> When you propose your talk if you have a preference toward a time slot and Saturday or Sunday please express that.
>
> General Guidelines:
> * Please provide an estimate of how long your talk will be. We are shooting for approximate 40 minute slots with between 15-20 minutes of talk and with likely an equal amount of question and discussion time afterward. Generally shorter talks are not an issue, however longer talks will need to be discussed and will be considered based on the rest of the schedule.
>
> * Topics should obviously be of interest to the other attendees, i.e., the broader Wine community, but note that that doesn't imply the talk has to be about Wine itself
>
> * If you have a preferred time and date for your talk please indicate that to me when you submit your talk. We will try to make it work as best we can.
>
> Here are the rough proposed slots, They will be changed and modified as required by the addenda as it gets fleshed out. Understand that even with this shift toward a scheduled day we will not disrupt productive conversation to fit to the schedule. The schedule will warp and flow as required to facilitate the talk, not force the talks to conform to it. This does mean if you are planing to try to attend a given talk you will likely want to arrive a bit early and understand if when you arrive the schedule is either behind or ahead of plan.
>
> Daily Slots:
>
> 09:00 - 09:40 slot 1
> 09:45 - 10:25 slot 2
> 10:30 - 11:00 break
> 11:00 - 11:40 slot 3
> 12:00 - 13:00 lunch break
> 13:00 - 13:40 slot 4
> 13:45 - 14:25 slot 5
> 14:30 - 15:00 break
> 15:00 - 15:40 slot 6
> 15:45 - 16:25 slot 7
> 16:25 - 17:00 Overflow time / small group discussion / short presentations
>
> We will track proposed presentations on the WineConf Wiki: https://wiki.winehq.org/WineConf2019
>
> Likely we will have open time at the conference which we will propose presentations and fill at the time. We have never had a problem finding things we all want to talk about.
>
> thanks!
> -aric
>
> _______________________________________________
> wineconf mailing list
> wineconf(a)winehq.org
> https://www.winehq.org/mailman/listinfo/wineconf
>
July 23, 2019
Re: [PATCH v2 2/6] user32/tests: Test a recursive activation loop on WM_ACTIVATE
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=54837
Your paranoid android.
=== wvistau64_zh_CN (32 bit report) ===
user32:
msg.c:16247: Test failed: 0: WaitForSingleObject failed
=== wvistau64_he (32 bit report) ===
user32:
msg.c:9186: Test failed: VK_N press/release: 3: in msg 0x0102 expecting wParam 0x6e got 0xee
msg.c:9186: Test failed: VK_N press/release: 4: the msg 0x0111 was expected, but got msg 0x0102 instead
msg.c:9213: Test failed: Alt+VK_N press/release: 6: in msg 0x0106 expecting wParam 0x6e got 0xee
msg.c:9213: Test failed: Alt+VK_N press/release: 7: in msg 0x0106 expecting wParam 0x6e got 0xee
msg.c:9213: Test failed: Alt+VK_N press/release: 8: in msg 0x0112 expecting lParam 0x6e got 0x5de
msg.c:9213: Test failed: Alt+VK_N press/release: 16: in msg 0x0120 expecting wParam 0x2000006e got 0x200000ee
msg.c:9237: Test failed: VK_N press/release: 3: in msg 0x0102 expecting wParam 0x6e got 0xee
msg.c:9237: Test failed: VK_N press/release: 4: the msg 0x0111 was expected, but got msg 0x0102 instead
msg.c:15309: Test failed: popup menu command: 4: in msg 0x0106 expecting wParam 0x65 got 0xf7
msg.c:15309: Test failed: popup menu command: 5: in msg 0x0008 expecting lParam 0x65 got 0x5e7
msg.c:15309: Test failed: popup menu command: 8: in msg 0x011f expecting wParam 0x900001 got 0xffff0000
msg.c:15309: Test failed: popup menu command: 9: the msg 0x0117 was expected, but got msg 0x0212 instead
msg.c:15309: Test failed: popup menu command: 11: the msg 0x011f was expected, but got msg 0x0007 instead
msg.c:15309: Test failed: popup menu command: 16: the msg 0x0125 was expected, but got msg 0x0105 instead
msg.c:15309: Test failed: popup menu command: 17: the msg 0x011f was expected, but got msg 0x0007 instead
msg.c:15309: Test failed: popup menu command: 18: the msg 0x0212 was expected, but got msg 0x0101 instead
msg.c:15309: Test failed: popup menu command: 19: the msg 0x0126 was expected, but got msg 0x0007 instead
msg.c:15309: Test failed: popup menu command: 21: the msg 0x0101 was expected, but got msg 0x0100 instead
msg.c:15309: Test failed: popup menu command: 22: the msg sequence is not complete: expected 0000 - actual 0102
msg.c:15327: Test failed: submenu of a popup menu command: 4: in msg 0x0106 expecting wParam 0x66 got 0xeb
msg.c:15327: Test failed: submenu of a popup menu command: 5: in msg 0x0008 expecting lParam 0x66 got 0x5db
msg.c:15327: Test failed: submenu of a popup menu command: 8: in msg 0x011f expecting wParam 0x900000 got 0xffff0000
msg.c:15327: Test failed: submenu of a popup menu command: 9: the msg 0x0117 was expected, but got msg 0x0212 instead
msg.c:15327: Test failed: submenu of a popup menu command: 12: the msg 0x0003 was expected, but got msg 0x0007 instead
msg.c:15327: Test failed: submenu of a popup menu command: 13: the msg 0x011f was expected, but got msg 0x0105 instead
msg.c:15327: Test failed: submenu of a popup menu command: 14: in msg 0x0007 expecting wParam 0x46 got 0x12
msg.c:15327: Test failed: submenu of a popup menu command: 14: in msg 0x0007 expecting lParam 0xf0000001 got 0xc0000001
msg.c:15327: Test failed: submenu of a popup menu command: 22: the msg 0x0004 was expected, but got msg 0x0101 instead
msg.c:15327: Test failed: submenu of a popup menu command: 23: the msg 0x0125 was expected, but got msg 0x0007 instead
msg.c:15327: Test failed: submenu of a popup menu command: 25: the msg 0x0125 was expected, but got msg 0x0100 instead
msg.c:15327: Test failed: submenu of a popup menu command: 26: the msg 0x011f was expected, but got msg 0x0007 instead
msg.c:15327: Test failed: submenu of a popup menu command: 27: the msg 0x0212 was expected, but got msg 0x0101 instead
msg.c:15327: Test failed: submenu of a popup menu command: 28: the msg 0x0126 was expected, but got msg 0x0007 instead
msg.c:15327: Test failed: submenu of a popup menu command: 30: the msg 0x0101 was expected, but got msg 0x0100 instead
msg.c:15327: Test failed: submenu of a popup menu command: 31: the msg sequence is not complete: expected 0000 - actual 0102
msg.c:15342: Test failed: single menu item command: 4: in msg 0x0106 expecting wParam 0x71 got 0x2f
msg.c:15342: Test failed: single menu item command: 5: in msg 0x0008 expecting lParam 0x71 got 0x2f
msg.c:15342: Test failed: single menu item command: 8: in msg 0x011f expecting wParam 0x80012c got 0xffff0000
msg.c:15342: Test failed: single menu item command: 9: the msg 0x011f was expected, but got msg 0x0212 instead
msg.c:15342: Test failed: single menu item command: 10: the msg 0x0212 was expected, but got msg 0x0007 instead
msg.c:15342: Test failed: single menu item command: 11: the msg 0x0126 was expected, but got msg 0x0105 instead
msg.c:15342: Test failed: single menu item command: 12: in msg 0x0007 expecting wParam 0x51 got 0x12
msg.c:15342: Test failed: single menu item command: 12: in msg 0x0007 expecting lParam 0xe0000001 got 0xc0000001
msg.c:15342: Test failed: single menu item command: 13: the msg 0x0105 was expected, but got msg 0x0101 instead
msg.c:15342: Test failed: single menu item command: 14: in msg 0x0007 expecting wParam 0x12 got 0x1b
msg.c:15342: Test failed: single menu item command: 14: in msg 0x0007 expecting lParam 0xc0000001 got 0x1
msg.c:15342: Test failed: single menu item command: 15: the msg 0x0101 was expected, but got msg 0x0100 instead
msg.c:15342: Test failed: single menu item command: 17: the msg 0x0100 was expected, but got msg 0x0102 instead
msg.c:15342: Test failed: single menu item command: 18: the msg 0x0102 was expected, but got msg 0x0007 instead
msg.c:15375: Test failed: submenu of a popup menu command: 4: in msg 0x0106 expecting wParam 0x66 got 0xeb
msg.c:15375: Test failed: submenu of a popup menu command: 5: in msg 0x0008 expecting lParam 0x66 got 0x5db
msg.c:15375: Test failed: submenu of a popup menu command: 8: in msg 0x011f expecting wParam 0x900000 got 0xffff0000
msg.c:15375: Test failed: submenu of a popup menu command: 9: the msg 0x0117 was expected, but got msg 0x0212 instead
msg.c:15375: Test failed: submenu of a popup menu command: 12: the msg 0x0003 was expected, but got msg 0x0007 instead
msg.c:15375: Test failed: submenu of a popup menu command: 13: the msg 0x011f was expected, but got msg 0x0105 instead
msg.c:15375: Test failed: submenu of a popup menu command: 14: in msg 0x0007 expecting wParam 0x46 got 0x12
msg.c:15375: Test failed: submenu of a popup menu command: 14: in msg 0x0007 expecting lParam 0xf0000001 got 0xc0000001
msg.c:15375: Test failed: submenu of a popup menu command: 22: the msg 0x0004 was expected, but got msg 0x0101 instead
msg.c:15375: Test failed: submenu of a popup menu command: 23: the msg 0x0125 was expected, but got msg 0x0007 instead
msg.c:15375: Test failed: submenu of a popup menu command: 25: the msg 0x0125 was expected, but got msg 0x0100 instead
msg.c:15375: Test failed: submenu of a popup menu command: 26: the msg 0x011f was expected, but got msg 0x0007 instead
msg.c:15375: Test failed: submenu of a popup menu command: 27: the msg 0x0212 was expected, but got msg 0x0101 instead
msg.c:15375: Test failed: submenu of a popup menu command: 28: the msg 0x0111 was expected, but got msg 0x0007 instead
msg.c:15375: Test failed: submenu of a popup menu command: 30: the msg 0x0101 was expected, but got msg 0x0100 instead
msg.c:15375: Test failed: submenu of a popup menu command: 31: the msg sequence is not complete: expected 0000 - actual 0102
Report errors:
user32:msg prints too much data (42544 bytes)
=== w1064v1809 (64 bit report) ===
user32:
msg.c:10287: Test failed: did not get expected count for minimum timeout (54 != ~100).
July 23, 2019
Re: [PATCH v2 1/6] user32/focus: Prevent a recursive loop with the activation messages
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=54836
Your paranoid android.
=== wvistau64_zh_CN (32 bit report) ===
user32:
msg.c:16167: Test failed: 0: WaitForSingleObject failed
msg.c:16167: Test failed: 1: WaitForSingleObject failed
=== wvistau64_he (32 bit report) ===
user32:
msg.c:9153: Test failed: VK_N press/release: 3: in msg 0x0102 expecting wParam 0x6e got 0xee
msg.c:9153: Test failed: VK_N press/release: 4: the msg 0x0111 was expected, but got msg 0x0102 instead
msg.c:9180: Test failed: Alt+VK_N press/release: 6: in msg 0x0106 expecting wParam 0x6e got 0xee
msg.c:9180: Test failed: Alt+VK_N press/release: 7: in msg 0x0106 expecting wParam 0x6e got 0xee
msg.c:9180: Test failed: Alt+VK_N press/release: 8: in msg 0x0112 expecting lParam 0x6e got 0x5de
msg.c:9180: Test failed: Alt+VK_N press/release: 16: in msg 0x0120 expecting wParam 0x2000006e got 0x200000ee
msg.c:9204: Test failed: VK_N press/release: 3: in msg 0x0102 expecting wParam 0x6e got 0xee
msg.c:9204: Test failed: VK_N press/release: 4: the msg 0x0111 was expected, but got msg 0x0102 instead
msg.c:15229: Test failed: popup menu command: 4: in msg 0x0106 expecting wParam 0x65 got 0xf7
msg.c:15229: Test failed: popup menu command: 5: in msg 0x0008 expecting lParam 0x65 got 0x5e7
msg.c:15229: Test failed: popup menu command: 8: in msg 0x011f expecting wParam 0x900001 got 0xffff0000
msg.c:15229: Test failed: popup menu command: 9: the msg 0x0117 was expected, but got msg 0x0212 instead
msg.c:15229: Test failed: popup menu command: 11: the msg 0x011f was expected, but got msg 0x0007 instead
msg.c:15229: Test failed: popup menu command: 16: the msg 0x0125 was expected, but got msg 0x0105 instead
msg.c:15229: Test failed: popup menu command: 17: the msg 0x011f was expected, but got msg 0x0007 instead
msg.c:15229: Test failed: popup menu command: 18: the msg 0x0212 was expected, but got msg 0x0101 instead
msg.c:15229: Test failed: popup menu command: 19: the msg 0x0126 was expected, but got msg 0x0007 instead
msg.c:15229: Test failed: popup menu command: 21: the msg 0x0101 was expected, but got msg 0x0100 instead
msg.c:15229: Test failed: popup menu command: 22: the msg sequence is not complete: expected 0000 - actual 0102
msg.c:15247: Test failed: submenu of a popup menu command: 4: in msg 0x0106 expecting wParam 0x66 got 0xeb
msg.c:15247: Test failed: submenu of a popup menu command: 5: in msg 0x0008 expecting lParam 0x66 got 0x5db
msg.c:15247: Test failed: submenu of a popup menu command: 8: in msg 0x011f expecting wParam 0x900000 got 0xffff0000
msg.c:15247: Test failed: submenu of a popup menu command: 9: the msg 0x0117 was expected, but got msg 0x0212 instead
msg.c:15247: Test failed: submenu of a popup menu command: 12: the msg 0x0003 was expected, but got msg 0x0007 instead
msg.c:15247: Test failed: submenu of a popup menu command: 13: the msg 0x011f was expected, but got msg 0x0105 instead
msg.c:15247: Test failed: submenu of a popup menu command: 14: in msg 0x0007 expecting wParam 0x46 got 0x12
msg.c:15247: Test failed: submenu of a popup menu command: 14: in msg 0x0007 expecting lParam 0xf0000001 got 0xc0000001
msg.c:15247: Test failed: submenu of a popup menu command: 22: the msg 0x0004 was expected, but got msg 0x0101 instead
msg.c:15247: Test failed: submenu of a popup menu command: 23: the msg 0x0125 was expected, but got msg 0x0007 instead
msg.c:15247: Test failed: submenu of a popup menu command: 25: the msg 0x0125 was expected, but got msg 0x0100 instead
msg.c:15247: Test failed: submenu of a popup menu command: 26: the msg 0x011f was expected, but got msg 0x0007 instead
msg.c:15247: Test failed: submenu of a popup menu command: 27: the msg 0x0212 was expected, but got msg 0x0101 instead
msg.c:15247: Test failed: submenu of a popup menu command: 28: the msg 0x0126 was expected, but got msg 0x0007 instead
msg.c:15247: Test failed: submenu of a popup menu command: 30: the msg 0x0101 was expected, but got msg 0x0100 instead
msg.c:15247: Test failed: submenu of a popup menu command: 31: the msg sequence is not complete: expected 0000 - actual 0102
msg.c:15262: Test failed: single menu item command: 4: in msg 0x0106 expecting wParam 0x71 got 0x2f
msg.c:15262: Test failed: single menu item command: 5: in msg 0x0008 expecting lParam 0x71 got 0x2f
msg.c:15262: Test failed: single menu item command: 8: in msg 0x011f expecting wParam 0x80012c got 0xffff0000
msg.c:15262: Test failed: single menu item command: 9: the msg 0x011f was expected, but got msg 0x0212 instead
msg.c:15262: Test failed: single menu item command: 10: the msg 0x0212 was expected, but got msg 0x0007 instead
msg.c:15262: Test failed: single menu item command: 11: the msg 0x0126 was expected, but got msg 0x0105 instead
msg.c:15262: Test failed: single menu item command: 12: in msg 0x0007 expecting wParam 0x51 got 0x12
msg.c:15262: Test failed: single menu item command: 12: in msg 0x0007 expecting lParam 0xe0000001 got 0xc0000001
msg.c:15262: Test failed: single menu item command: 13: the msg 0x0105 was expected, but got msg 0x0101 instead
msg.c:15262: Test failed: single menu item command: 14: in msg 0x0007 expecting wParam 0x12 got 0x1b
msg.c:15262: Test failed: single menu item command: 14: in msg 0x0007 expecting lParam 0xc0000001 got 0x1
msg.c:15262: Test failed: single menu item command: 15: the msg 0x0101 was expected, but got msg 0x0100 instead
msg.c:15262: Test failed: single menu item command: 17: the msg 0x0100 was expected, but got msg 0x0102 instead
msg.c:15262: Test failed: single menu item command: 18: the msg 0x0102 was expected, but got msg 0x0007 instead
msg.c:15295: Test failed: submenu of a popup menu command: 4: in msg 0x0106 expecting wParam 0x66 got 0xeb
msg.c:15295: Test failed: submenu of a popup menu command: 5: in msg 0x0008 expecting lParam 0x66 got 0x5db
msg.c:15295: Test failed: submenu of a popup menu command: 8: in msg 0x011f expecting wParam 0x900000 got 0xffff0000
msg.c:15295: Test failed: submenu of a popup menu command: 9: the msg 0x0117 was expected, but got msg 0x0212 instead
msg.c:15295: Test failed: submenu of a popup menu command: 12: the msg 0x0003 was expected, but got msg 0x0007 instead
msg.c:15295: Test failed: submenu of a popup menu command: 13: the msg 0x011f was expected, but got msg 0x0105 instead
msg.c:15295: Test failed: submenu of a popup menu command: 14: in msg 0x0007 expecting wParam 0x46 got 0x12
msg.c:15295: Test failed: submenu of a popup menu command: 14: in msg 0x0007 expecting lParam 0xf0000001 got 0xc0000001
msg.c:15295: Test failed: submenu of a popup menu command: 22: the msg 0x0004 was expected, but got msg 0x0101 instead
msg.c:15295: Test failed: submenu of a popup menu command: 23: the msg 0x0125 was expected, but got msg 0x0007 instead
msg.c:15295: Test failed: submenu of a popup menu command: 25: the msg 0x0125 was expected, but got msg 0x0100 instead
msg.c:15295: Test failed: submenu of a popup menu command: 26: the msg 0x011f was expected, but got msg 0x0007 instead
msg.c:15295: Test failed: submenu of a popup menu command: 27: the msg 0x0212 was expected, but got msg 0x0101 instead
msg.c:15295: Test failed: submenu of a popup menu command: 28: the msg 0x0111 was expected, but got msg 0x0007 instead
msg.c:15295: Test failed: submenu of a popup menu command: 30: the msg 0x0101 was expected, but got msg 0x0100 instead
msg.c:15295: Test failed: submenu of a popup menu command: 31: the msg sequence is not complete: expected 0000 - actual 0102
Report errors:
user32:msg prints too much data (42538 bytes)
=== w1064v1809 (64 bit report) ===
user32:
msg.c:9334: Test failed: Shift+MouseButton press/release: 7: the msg 0x0202 was expected, but got msg 0x0007 instead
msg.c:9334: Test failed: Shift+MouseButton press/release: 8: the msg 0x0202 was expected, but got msg 0x0101 instead
msg.c:9334: Test failed: Shift+MouseButton press/release: 10: the msg 0x0101 should have been sent
msg.c:9334: Test failed: Shift+MouseButton press/release: 11: the msg sequence is not complete: expected 0101 - actual 0000
=== debian9 (32 bit report) ===
user32:
msg.c:8713: Test failed: WaitForSingleObject failed 102
msg.c:8719: Test failed: destroy child on thread exit: 0: the msg 0x0082 was expected, but got msg 0x000f instead
msg.c:8719: Test failed: destroy child on thread exit: 1: the msg 0x000f was expected, but got msg 0x0014 instead
msg.c:8719: Test failed: destroy child on thread exit: 2: the msg sequence is not complete: expected 0014 - actual 0000
July 23, 2019
Re: [PATCH v2 3/6] server: Add request for sending native raw-input messages.
by Derek Lesho
Yeah I'm not sure whether they should be merged either, I think it comes
down to preference. Maybe Vincent or Alexandre should decide.
About using the union in hardware_msg_data, you're right, I didn't notice
that and I'll deduplicate that.
On Tue, Jul 23, 2019 at 3:50 AM Rémi Bernon <rbernon(a)codeweavers.com> wrote:
> On Sat, 2019-06-29 at 22:26 -0400, Derek Lesho wrote:
> > Signed-off-by: Derek Lesho <dereklesho52(a)Gmail.com>
> > ---
> > server/protocol.def | 28 ++++++++++++++++++++++++++++
> > server/queue.c | 41 +++++++++++++++++++++++++++++++++++++++++
> > server/trace.c | 21 +++++++++++++++++++++
> > tools/make_requests | 1 +
> > 4 files changed, 91 insertions(+)
> >
> > diff --git a/server/protocol.def b/server/protocol.def
> > index 8b8a8a1512..3a6a202f49 100644
> > --- a/server/protocol.def
> > +++ b/server/protocol.def
> > @@ -358,6 +358,29 @@ typedef union
> > } hw;
> > } hw_input_t;
> >
> > +typedef union
> > +{
> > + int type;
> > + struct
> > + {
> > + int type; /* RIM_TYPEMOUSE */
> > + int x; /* relative x movement */
> > + int y; /* relative y movement */
> > + unsigned short button_flags; /* mouse button */
> > + unsigned short button_data; /* event details */
> > + } mouse;
> > + struct
> > + {
> > + int type; /* RIM_TYPEKEYBOARD */
> > + /* TODO: fill this in if/when necessary */
> > + } kbd;
> > + struct
> > + {
> > + int type; /* RIM_TYPEHID */
> > + /* TODO: fill this in if/when necessary */
> > + } hid;
> > +} hw_rawinput_t;
>
> I'm still wondering if it should be merged with hw_input_t or not and
> use the same send_hardware_message request for raw inputs and normal
> inputs, but in any case this union should at least be used for the
> rawinput field in struct hardware_msg_data (with the kbd fields added)
> instead of duplicating it.
> --
> Rémi Bernon <rbernon(a)codeweavers.com>
>
>
>
>
July 23, 2019
Re: [PATCH v2 5/6] server: Don't emulate rawinput mouse events if native exist.
by Derek Lesho
Well, while it is certainly possible to use actual rawinput for sending
keyboard events and mouse presses, I don't see much of an incentive to.
With mouse motion, the DE is bypassed so mouse acceleration and sensitivity
are bypassed (just like on windows), but I don't think DE's modify keyboard
events or mouse presses in any meaningful way.
Plus, the fewer code paths we have doing the same thing the better I think.
On Tue, Jul 23, 2019 at 4:08 AM Rémi Bernon <rbernon(a)codeweavers.com> wrote:
> On Sat, 2019-06-29 at 22:26 -0400, Derek Lesho wrote:
> > Signed-off-by: Derek Lesho <dereklesho52(a)Gmail.com>
> > ---
> > server/protocol.def | 2 +
> > server/queue.c | 99 ++++++++++++++++++++++++++-------------------
> > 2 files changed, 59 insertions(+), 42 deletions(-)
> >
> > diff --git a/server/protocol.def b/server/protocol.def
> > index 3a6a202f49..9703b49154 100644
> > --- a/server/protocol.def
> > +++ b/server/protocol.def
> > @@ -358,6 +358,8 @@ typedef union
> > } hw;
> > } hw_input_t;
> >
> > +#define RIM_ENABLE_NATIVE_MOUSE_MOVE 0x0800
> > +#define RIM_ENABLE_NATIVE_MOUSE_PRESS 0x1000
> > typedef union
> > {
> > int type;
> > diff --git a/server/queue.c b/server/queue.c
> > index 35cfcecff5..41c26d8fa0 100644
> > --- a/server/queue.c
> > +++ b/server/queue.c
> > @@ -1599,6 +1599,9 @@ static int send_hook_ll_message( struct desktop
> *desktop, struct message *hardwa
> > return 1;
> > }
> >
> > +int emulate_raw_mouse_move = 1;
> > +int emulate_raw_mouse_press = 1;
> > +
> > /* queue a hardware message for a mouse event */
> > static int queue_mouse_message( struct desktop *desktop, user_handle_t
> win, const hw_input_t *input,
> > unsigned int origin, struct msg_queue
> *sender )
> > @@ -1666,53 +1669,59 @@ static int queue_mouse_message( struct desktop
> *desktop, user_handle_t win, cons
> >
> > if ((device = current->process->rawinput_mouse))
> > {
> > - if (!(msg = alloc_hardware_message( input->mouse.info, source,
> time ))) return 0;
> > - msg_data = msg->data;
> > + if ( (emulate_raw_mouse_press && flags & ~MOUSEEVENTF_MOVE) ||
> (emulate_raw_mouse_move && flags & MOUSEEVENTF_MOVE) )
> > + {
> > + if (!(msg = alloc_hardware_message( input->mouse.info,
> source, time ))) return 0;
> > + msg_data = msg->data;
> >
> > - msg->win = device->target;
> > - msg->msg = WM_INPUT;
> > - msg->wparam = RIM_INPUT;
> > - msg->lparam = 0;
> > + msg->win = device->target;
> > + msg->msg = WM_INPUT;
> > + msg->wparam = RIM_INPUT;
> > + msg->lparam = 0;
> >
> > - msg_data->flags = 0;
> > - msg_data->rawinput.type = RIM_TYPEMOUSE;
> > - msg_data->rawinput.mouse.x = x - desktop->cursor.x;
> > - msg_data->rawinput.mouse.y = y - desktop->cursor.y;
> > - msg_data->rawinput.mouse.button_flags = 0;
> > - msg_data->rawinput.mouse.button_data = 0;
> > + msg_data->flags = 0;
> > + msg_data->rawinput.type = RIM_TYPEMOUSE;
> > + msg_data->rawinput.mouse.x = emulate_raw_mouse_move ? x
> - desktop->cursor.x : 0;
> > + msg_data->rawinput.mouse.y = emulate_raw_mouse_move ? y
> - desktop->cursor.y : 0;
> > + msg_data->rawinput.mouse.button_flags = 0;
> > + msg_data->rawinput.mouse.button_data = 0;
> >
> > - for (i = 1; i < ARRAY_SIZE(raw_button_flags); ++i)
> > - {
> > - if (flags & (1 << i))
> > - msg_data->rawinput.mouse.button_flags |=
> raw_button_flags[i];
> > - }
> > + if (emulate_raw_mouse_press)
> > + {
> > + for (i = 1; i < ARRAY_SIZE(raw_button_flags); ++i)
> > + {
> > + if (flags & (1 << i))
> > + msg_data->rawinput.mouse.button_flags |=
> raw_button_flags[i];
> > + }
> >
> > - if (flags & MOUSEEVENTF_WHEEL)
> > - {
> > - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_WHEEL;
> > - msg_data->rawinput.mouse.button_data = input->mouse.data;
> > - }
> > - if (flags & MOUSEEVENTF_HWHEEL)
> > - {
> > - msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_HORIZONTAL_WHEEL;
> > - msg_data->rawinput.mouse.button_data = input->mouse.data;
> > - }
> > - if (flags & MOUSEEVENTF_XDOWN)
> > - {
> > - if (input->mouse.data == XBUTTON1)
> > - msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_BUTTON_4_DOWN;
> > - else if (input->mouse.data == XBUTTON2)
> > - msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_BUTTON_5_DOWN;
> > - }
> > - if (flags & MOUSEEVENTF_XUP)
> > - {
> > - if (input->mouse.data == XBUTTON1)
> > - msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_BUTTON_4_UP;
> > - else if (input->mouse.data == XBUTTON2)
> > - msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_BUTTON_5_UP;
> > - }
> > + if (flags & MOUSEEVENTF_WHEEL)
> > + {
> > + msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_WHEEL;
> > + msg_data->rawinput.mouse.button_data =
> input->mouse.data;
> > + }
> > + if (flags & MOUSEEVENTF_HWHEEL)
> > + {
> > + msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_HORIZONTAL_WHEEL;
> > + msg_data->rawinput.mouse.button_data =
> input->mouse.data;
> > + }
> > + if (flags & MOUSEEVENTF_XDOWN)
> > + {
> > + if (input->mouse.data == XBUTTON1)
> > + msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_BUTTON_4_DOWN;
> > + else if (input->mouse.data == XBUTTON2)
> > + msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_BUTTON_5_DOWN;
> > + }
> > + if (flags & MOUSEEVENTF_XUP)
> > + {
> > + if (input->mouse.data == XBUTTON1)
> > + msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_BUTTON_4_UP;
> > + else if (input->mouse.data == XBUTTON2)
> > + msg_data->rawinput.mouse.button_flags |=
> RI_MOUSE_BUTTON_5_UP;
> > + }
> > + }
> >
> > - queue_hardware_message( desktop, msg, 0 );
> > + queue_hardware_message( desktop, msg, 0 );
> > + }
> >
> > if (device->flags & RIDEV_NOLEGACY)
> > return FALSE;
> > @@ -2455,6 +2464,12 @@ DECL_HANDLER(send_rawinput_message)
> > queue_hardware_message( desktop, msg, 0 );
> > }
> > break;
> > + case RIM_ENABLE_NATIVE_MOUSE_MOVE:
> > + emulate_raw_mouse_move = 0;
> > + break;
> > + case RIM_ENABLE_NATIVE_MOUSE_PRESS:
> > + emulate_raw_mouse_press = 0;
> > + break;
> > default:
> > set_error( STATUS_INVALID_PARAMETER );
> > }
>
> Don't you think we could simplify that by using only one
> emulate_raw_input flag? Are there any platforms where only some of the
> raw input events are received?
>
> Also the flag could probably be cleared on the first direct raw input
> request received instead of requiring private flag values, and an empty
> raw input event could be sent right after the initialization if we
> still want to be informed early on.
> --
> Rémi Bernon <rbernon(a)codeweavers.com>
>
>
>
>
July 23, 2019
Re: [PATCH v7 6/7] winex11.drv: Implement native mouse-movement raw-input using RawMotion.
by Derek Lesho
Thank you so much for your help, I'll make the relevant changes as soon as
I get home.
On Tue, Jul 23, 2019 at 10:34 AM Rémi Bernon <rbernon(a)codeweavers.com>
wrote:
> On Tue, 2019-07-23 at 09:26 +0200, Rémi Bernon wrote:
> > On Mon, 2019-07-22 at 22:16 -0400, Derek Lesho wrote:
> > > Thank you for looking into this, would the solution to this problem be
> to
> > > preserve the event from the slave pointer in merge_raw_events?
> > >
> > > On Mon, Jul 22, 2019 at 10:06 AM Rémi Bernon <rbernon(a)codeweavers.com>
> > > wrote:
> > >
> > > > It looks like that if the cursor isn't clipped by the application (or
> > > > by wine in fullscreen), then both master and slave XI2 device events
> > > > are received (on the contrary, when the cursor is clipped then for
> some
> > > > unclear reason only the slave device events are received).
> > > >
> > > > In this case, one of the events is then discarded by
> > > > merge_raw_motion_events in dlls/winex11.drv/event.c and as
> > > > X11DRV_RawMotion is designed to track only slave devices (one per
> > > > thread with the xi2_current_slave field AFAICS?), depending on which
> > > > comes first, the event might not be processed and no raw input be
> sent.
> > > > --
> > > > Rémi Bernon <rbernon(a)codeweavers.com>
> > > >
> >
> > I'm still not sure how everything works in winex11.drv, but I believe
> > raw input implementation could use some cleanup. For instance, I don't
> > understand why a single slave device is selected rather than listening
> > to the master device events, I find it a bit unreliable that the first
> > slave device that sends events is selected over the others.
>
> From http://who-t.blogspot.com/2009/06/xi2-recipes-part-3.html it looks
> like every time the user starts using a different slave device, there's
> a DeviceChanged event being sent, so I guess it explains why.
>
> > I would say that, for simplicity, only the master device events should
> > be translated, but that would require to make it send events even when
> > the cursor is clipped, and first understand why it doesn't (AFAICS with
> > some Xlib test app, there's no differences before and after calling
> > XGrabPointer so there's something else going on).
> >
> > If that's not possible, or for a "better" implementation, then all and
> > only slave devices should be listened to, and their inputs translated
> > to the corresponding Windows raw input messages. Also, it may be useful
> > to implement WM_INPUT_DEVICE_CHANGE messages on the corresponding
> > XInput2 events (but that may be done later and only if deemed useful).
>
> Reading the series of posts about XInput2 linked above makes me think
> that listening to master devices is the correct way to proceed. It will
> also simplify the code, as we could even simplify the event mask by
> using XIAllMasterDevices instead of having to filter the events.
>
> Regarding why master device events aren't sent once XGrabPointer is
> active only, the reason looks to be that wine advertises to support
> XInput 2.0 client API only. Calling XIQueryVersion with major = 2 and
> minor >= 1 in X11DRV_XInput2_Enable fixes the issue.
>
> With all that, I believe that you should be able to make every window
> thread listen to XInput2 events without worrying anymore about
> duplicates, and the wineserver will dispatch the events to the right
> windows. You could maybe decide to report the raw inputs only to the
> foreground window in wineserver, or implement the RIDEV_INPUTSINK flag
> / RIM_INPUTSINK wParam for background raw input.
> --
> Rémi Bernon <rbernon(a)codeweavers.com>
>
>
July 23, 2019
Re: [PATCH v2] windowscodecs: Move from_sRGB_component into the same section as its sole sole user.
by Vincent Povirk (they/them)
Signed-off-by: Vincent Povirk <vincent(a)codeweavers.com>
July 23, 2019
Re: [PATCH v7 6/7] winex11.drv: Implement native mouse-movement raw-input using RawMotion.
by Rémi Bernon
On Tue, 2019-07-23 at 09:26 +0200, Rémi Bernon wrote:
> On Mon, 2019-07-22 at 22:16 -0400, Derek Lesho wrote:
> > Thank you for looking into this, would the solution to this problem be to
> > preserve the event from the slave pointer in merge_raw_events?
> >
> > On Mon, Jul 22, 2019 at 10:06 AM Rémi Bernon <rbernon(a)codeweavers.com>
> > wrote:
> >
> > > It looks like that if the cursor isn't clipped by the application (or
> > > by wine in fullscreen), then both master and slave XI2 device events
> > > are received (on the contrary, when the cursor is clipped then for some
> > > unclear reason only the slave device events are received).
> > >
> > > In this case, one of the events is then discarded by
> > > merge_raw_motion_events in dlls/winex11.drv/event.c and as
> > > X11DRV_RawMotion is designed to track only slave devices (one per
> > > thread with the xi2_current_slave field AFAICS?), depending on which
> > > comes first, the event might not be processed and no raw input be sent.
> > > --
> > > Rémi Bernon <rbernon(a)codeweavers.com>
> > >
>
> I'm still not sure how everything works in winex11.drv, but I believe
> raw input implementation could use some cleanup. For instance, I don't
> understand why a single slave device is selected rather than listening
> to the master device events, I find it a bit unreliable that the first
> slave device that sends events is selected over the others.
>From http://who-t.blogspot.com/2009/06/xi2-recipes-part-3.html it looks
like every time the user starts using a different slave device, there's
a DeviceChanged event being sent, so I guess it explains why.
> I would say that, for simplicity, only the master device events should
> be translated, but that would require to make it send events even when
> the cursor is clipped, and first understand why it doesn't (AFAICS with
> some Xlib test app, there's no differences before and after calling
> XGrabPointer so there's something else going on).
>
> If that's not possible, or for a "better" implementation, then all and
> only slave devices should be listened to, and their inputs translated
> to the corresponding Windows raw input messages. Also, it may be useful
> to implement WM_INPUT_DEVICE_CHANGE messages on the corresponding
> XInput2 events (but that may be done later and only if deemed useful).
Reading the series of posts about XInput2 linked above makes me think
that listening to master devices is the correct way to proceed. It will
also simplify the code, as we could even simplify the event mask by
using XIAllMasterDevices instead of having to filter the events.
Regarding why master device events aren't sent once XGrabPointer is
active only, the reason looks to be that wine advertises to support
XInput 2.0 client API only. Calling XIQueryVersion with major = 2 and
minor >= 1 in X11DRV_XInput2_Enable fixes the issue.
With all that, I believe that you should be able to make every window
thread listen to XInput2 events without worrying anymore about
duplicates, and the wineserver will dispatch the events to the right
windows. You could maybe decide to report the raw inputs only to the
foreground window in wineserver, or implement the RIDEV_INPUTSINK flag
/ RIM_INPUTSINK wParam for background raw input.
--
Rémi Bernon <rbernon(a)codeweavers.com>
July 23, 2019
Re: [PATCH v7 6/7] winex11.drv: Implement native mouse-movement raw-input using RawMotion.
by Rémi Bernon
On Sat, 2019-07-20 at 16:09 -0400, Derek Lesho wrote:
> Signed-off-by: Derek Lesho <dereklesho52(a)Gmail.com>
> ---
> dlls/winex11.drv/mouse.c | 89 +++++++++++++++++++++++++++-------
> dlls/winex11.drv/x11drv.h | 4 +-
> dlls/winex11.drv/x11drv_main.c | 4 ++
> 3 files changed, 79 insertions(+), 18 deletions(-)
>
> diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
> index f737a306a5..db71a33a41 100644
> --- a/dlls/winex11.drv/mouse.c
> +++ b/dlls/winex11.drv/mouse.c
> @@ -284,11 +284,26 @@ static void update_relative_valuators(XIAnyClassInfo **valuators, int n_valuator
> }
> #endif
>
> +/***********************************************************************
> + * inform_wineserver
> + */
> +static void inform_wineserver(void)
> +{
> + static int once = 0;
> + if (!once)
> + {
> + RAWINPUT raw_input;
> + raw_input.header.dwType = RIM_ENABLE_NATIVE_MOUSE_MOVE;
> + __wine_send_raw_input(&raw_input);
> + once = 1;
> + }
> +}
> +
>
> /***********************************************************************
> - * enable_xinput2
> + * X11DRV_XInput2_Enable
> */
> -static void enable_xinput2(void)
> +void X11DRV_XInput2_Enable(void)
> {
> #ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
> struct x11drv_thread_data *data = x11drv_thread_data();
> @@ -318,7 +333,6 @@ static void enable_xinput2(void)
> memset( mask_bits, 0, sizeof(mask_bits) );
> XISetMask( mask_bits, XI_DeviceChanged );
> XISetMask( mask_bits, XI_RawMotion );
> - XISetMask( mask_bits, XI_ButtonPress );
>
> pXISelectEvents( data->display, DefaultRootWindow( data->display ), &mask, 1 );
>
> @@ -337,19 +351,21 @@ static void enable_xinput2(void)
> data->xi2_current_slave = 0;
>
> data->xi2_state = xi_enabled;
> +
> + inform_wineserver();
> #endif
> }
>
> /***********************************************************************
> - * disable_xinput2
> + * X11DRV_XInput2_Disable
> */
> -static void disable_xinput2(void)
> +void X11DRV_XInput2_Disable(void)
> {
> #ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
> struct x11drv_thread_data *data = x11drv_thread_data();
> XIEventMask mask;
>
> - if (data->xi2_state != xi_enabled) return;
> + if (data->xi2_state < xi_enabled) return;
>
> TRACE( "disabling\n" );
> data->xi2_state = xi_disabled;
> @@ -368,6 +384,21 @@ static void disable_xinput2(void)
> #endif
> }
>
> +static void use_xinput2_path(void)
> +{
> + struct x11drv_thread_data *thread_data = x11drv_thread_data();
> +
> + if (thread_data->xi2_state == xi_enabled)
> + thread_data->xi2_state = xi_extra;
> +}
> +
> +static void disable_xinput2_path(void)
> +{
> + struct x11drv_thread_data *thread_data = x11drv_thread_data();
> +
> + if (thread_data->xi2_state == xi_extra)
> + thread_data->xi2_state = xi_enabled;
> +}
>
> /***********************************************************************
> * grab_clipping_window
> @@ -393,9 +424,9 @@ static BOOL grab_clipping_window( const RECT *clip )
> return TRUE;
>
> /* enable XInput2 unless we are already clipping */
> - if (!data->clip_hwnd) enable_xinput2();
> + if (!data->clip_hwnd) use_xinput2_path();
>
> - if (data->xi2_state != xi_enabled)
> + if (data->xi2_state < xi_extra)
> {
> WARN( "XInput2 not supported, refusing to clip to %s\n", wine_dbgstr_rect(clip) );
> DestroyWindow( msg_hwnd );
> @@ -423,7 +454,7 @@ static BOOL grab_clipping_window( const RECT *clip )
>
> if (!clipping_cursor)
> {
> - disable_xinput2();
> + disable_xinput2_path();
> DestroyWindow( msg_hwnd );
> return FALSE;
> }
> @@ -489,7 +520,7 @@ LRESULT clip_cursor_notify( HWND hwnd, HWND new_clip_hwnd )
> TRACE( "clip hwnd reset from %p\n", hwnd );
> data->clip_hwnd = 0;
> data->clip_reset = GetTickCount();
> - disable_xinput2();
> + disable_xinput2_path();
> DestroyWindow( hwnd );
> }
> else if (hwnd == GetForegroundWindow()) /* request to clip */
> @@ -1724,16 +1755,19 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
> {
> XIRawEvent *event = xev->data;
> const double *values = event->valuators.values;
> + const double *raw_values = event->raw_values;
> RECT virtual_rect;
> INPUT input;
> + RAWINPUT raw_input;
> int i;
> - double dx = 0, dy = 0, val;
> + double dx = 0, dy = 0, raw_dx = 0, raw_dy = 0, val, raw_val;
> struct x11drv_thread_data *thread_data = x11drv_thread_data();
> struct x11drv_valuator_data *x_rel, *y_rel;
> + static unsigned long last_time = 0;
>
> if (thread_data->x_rel_valuator.number < 0 || thread_data->y_rel_valuator.number < 0) return FALSE;
> if (!event->valuators.mask_len) return FALSE;
> - if (thread_data->xi2_state != xi_enabled) return FALSE;
> + if (thread_data->xi2_state < xi_enabled) return FALSE;
>
> /* If there is no slave currently detected, no previous motion nor device
> * change events were received. Look it up now on the device list in this
> @@ -1758,12 +1792,20 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
> x_rel = &thread_data->x_rel_valuator;
> y_rel = &thread_data->y_rel_valuator;
>
> + input.type = INPUT_MOUSE;
> input.u.mi.mouseData = 0;
> input.u.mi.dwFlags = MOUSEEVENTF_MOVE;
> input.u.mi.time = EVENT_x11_time_to_win32_time( event->time );
> input.u.mi.dwExtraInfo = 0;
> - input.u.mi.dx = 0;
> - input.u.mi.dy = 0;
> + input.u.mi.dx = 0;
> + input.u.mi.dy = 0;
> +
> + raw_input.header.dwType = RIM_TYPEMOUSE;
> + raw_input.data.mouse.u.usButtonFlags = 0;
> + raw_input.data.mouse.u.usButtonData = 0;
> + raw_input.data.mouse.ulExtraInformation = 0;
> + raw_input.data.mouse.lLastX = 0;
> + raw_input.data.mouse.lLastY = 0;
>
> virtual_rect = get_virtual_screen_rect();
>
> @@ -1771,12 +1813,15 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
> {
> if (!XIMaskIsSet( event->valuators.mask, i )) continue;
> val = *values++;
> + raw_val = *raw_values++;
> if (i == x_rel->number)
> {
> input.u.mi.dx = dx = val;
> if (x_rel->min < x_rel->max)
> input.u.mi.dx = val * (virtual_rect.right - virtual_rect.left)
> / (x_rel->max - x_rel->min);
> +
> + raw_input.data.mouse.lLastX = raw_dx = raw_val;
> }
> if (i == y_rel->number)
> {
> @@ -1784,6 +1829,8 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
> if (y_rel->min < y_rel->max)
> input.u.mi.dy = val * (virtual_rect.bottom - virtual_rect.top)
> / (y_rel->max - y_rel->min);
> +
> + raw_input.data.mouse.lLastY = raw_dy = raw_val;
> }
> }
>
> @@ -1793,10 +1840,18 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
> return FALSE;
> }
>
> - TRACE( "pos %d,%d (event %f,%f)\n", input.u.mi.dx, input.u.mi.dy, dx, dy );
> + if (thread_data->xi2_state == xi_extra)
> + {
> + TRACE( "pos %d,%d (event %f,%f)\n", input.u.mi.dx, input.u.mi.dy, dx, dy );
> + __wine_send_input( 0, &input );
> + }
> +
> + if (InterlockedExchange( (LONG volatile*)&last_time, (LONG)event->time ) != event->time)
> + {
> + TRACE("raw event %f,%f\n", raw_dx, raw_dy);
> + __wine_send_raw_input( &raw_input );
> + }
>
> - input.type = INPUT_MOUSE;
> - __wine_send_input( 0, &input );
> return TRUE;
> }
I think it /should/ be safe to only call __wine_send_raw_input here,
although not 100% sure about it.
AFAICS MotionNotify events are sent as well - even with a 0x0 clip
rectangle - and they will get translated to the corresponding WM_MOUSE*
and WM_*BUTTON* events, and update the desktop cursor position if
necessary. I understand that the call was here only to trigger the raw
input emulation.
--
Rémi Bernon <rbernon(a)codeweavers.com>
July 23, 2019
Re: [PATCH v2 5/6] server: Don't emulate rawinput mouse events if native exist.
by Rémi Bernon
On Sat, 2019-06-29 at 22:26 -0400, Derek Lesho wrote:
> Signed-off-by: Derek Lesho <dereklesho52(a)Gmail.com>
> ---
> server/protocol.def | 2 +
> server/queue.c | 99 ++++++++++++++++++++++++++-------------------
> 2 files changed, 59 insertions(+), 42 deletions(-)
>
> diff --git a/server/protocol.def b/server/protocol.def
> index 3a6a202f49..9703b49154 100644
> --- a/server/protocol.def
> +++ b/server/protocol.def
> @@ -358,6 +358,8 @@ typedef union
> } hw;
> } hw_input_t;
>
> +#define RIM_ENABLE_NATIVE_MOUSE_MOVE 0x0800
> +#define RIM_ENABLE_NATIVE_MOUSE_PRESS 0x1000
> typedef union
> {
> int type;
> diff --git a/server/queue.c b/server/queue.c
> index 35cfcecff5..41c26d8fa0 100644
> --- a/server/queue.c
> +++ b/server/queue.c
> @@ -1599,6 +1599,9 @@ static int send_hook_ll_message( struct desktop *desktop, struct message *hardwa
> return 1;
> }
>
> +int emulate_raw_mouse_move = 1;
> +int emulate_raw_mouse_press = 1;
> +
> /* queue a hardware message for a mouse event */
> static int queue_mouse_message( struct desktop *desktop, user_handle_t win, const hw_input_t *input,
> unsigned int origin, struct msg_queue *sender )
> @@ -1666,53 +1669,59 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons
>
> if ((device = current->process->rawinput_mouse))
> {
> - if (!(msg = alloc_hardware_message( input->mouse.info, source, time ))) return 0;
> - msg_data = msg->data;
> + if ( (emulate_raw_mouse_press && flags & ~MOUSEEVENTF_MOVE) || (emulate_raw_mouse_move && flags & MOUSEEVENTF_MOVE) )
> + {
> + if (!(msg = alloc_hardware_message( input->mouse.info, source, time ))) return 0;
> + msg_data = msg->data;
>
> - msg->win = device->target;
> - msg->msg = WM_INPUT;
> - msg->wparam = RIM_INPUT;
> - msg->lparam = 0;
> + msg->win = device->target;
> + msg->msg = WM_INPUT;
> + msg->wparam = RIM_INPUT;
> + msg->lparam = 0;
>
> - msg_data->flags = 0;
> - msg_data->rawinput.type = RIM_TYPEMOUSE;
> - msg_data->rawinput.mouse.x = x - desktop->cursor.x;
> - msg_data->rawinput.mouse.y = y - desktop->cursor.y;
> - msg_data->rawinput.mouse.button_flags = 0;
> - msg_data->rawinput.mouse.button_data = 0;
> + msg_data->flags = 0;
> + msg_data->rawinput.type = RIM_TYPEMOUSE;
> + msg_data->rawinput.mouse.x = emulate_raw_mouse_move ? x - desktop->cursor.x : 0;
> + msg_data->rawinput.mouse.y = emulate_raw_mouse_move ? y - desktop->cursor.y : 0;
> + msg_data->rawinput.mouse.button_flags = 0;
> + msg_data->rawinput.mouse.button_data = 0;
>
> - for (i = 1; i < ARRAY_SIZE(raw_button_flags); ++i)
> - {
> - if (flags & (1 << i))
> - msg_data->rawinput.mouse.button_flags |= raw_button_flags[i];
> - }
> + if (emulate_raw_mouse_press)
> + {
> + for (i = 1; i < ARRAY_SIZE(raw_button_flags); ++i)
> + {
> + if (flags & (1 << i))
> + msg_data->rawinput.mouse.button_flags |= raw_button_flags[i];
> + }
>
> - if (flags & MOUSEEVENTF_WHEEL)
> - {
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_WHEEL;
> - msg_data->rawinput.mouse.button_data = input->mouse.data;
> - }
> - if (flags & MOUSEEVENTF_HWHEEL)
> - {
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_HORIZONTAL_WHEEL;
> - msg_data->rawinput.mouse.button_data = input->mouse.data;
> - }
> - if (flags & MOUSEEVENTF_XDOWN)
> - {
> - if (input->mouse.data == XBUTTON1)
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_4_DOWN;
> - else if (input->mouse.data == XBUTTON2)
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_5_DOWN;
> - }
> - if (flags & MOUSEEVENTF_XUP)
> - {
> - if (input->mouse.data == XBUTTON1)
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_4_UP;
> - else if (input->mouse.data == XBUTTON2)
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_5_UP;
> - }
> + if (flags & MOUSEEVENTF_WHEEL)
> + {
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_WHEEL;
> + msg_data->rawinput.mouse.button_data = input->mouse.data;
> + }
> + if (flags & MOUSEEVENTF_HWHEEL)
> + {
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_HORIZONTAL_WHEEL;
> + msg_data->rawinput.mouse.button_data = input->mouse.data;
> + }
> + if (flags & MOUSEEVENTF_XDOWN)
> + {
> + if (input->mouse.data == XBUTTON1)
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_4_DOWN;
> + else if (input->mouse.data == XBUTTON2)
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_5_DOWN;
> + }
> + if (flags & MOUSEEVENTF_XUP)
> + {
> + if (input->mouse.data == XBUTTON1)
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_4_UP;
> + else if (input->mouse.data == XBUTTON2)
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_5_UP;
> + }
> + }
>
> - queue_hardware_message( desktop, msg, 0 );
> + queue_hardware_message( desktop, msg, 0 );
> + }
>
> if (device->flags & RIDEV_NOLEGACY)
> return FALSE;
> @@ -2455,6 +2464,12 @@ DECL_HANDLER(send_rawinput_message)
> queue_hardware_message( desktop, msg, 0 );
> }
> break;
> + case RIM_ENABLE_NATIVE_MOUSE_MOVE:
> + emulate_raw_mouse_move = 0;
> + break;
> + case RIM_ENABLE_NATIVE_MOUSE_PRESS:
> + emulate_raw_mouse_press = 0;
> + break;
> default:
> set_error( STATUS_INVALID_PARAMETER );
> }
Don't you think we could simplify that by using only one
emulate_raw_input flag? Are there any platforms where only some of the
raw input events are received?
Also the flag could probably be cleared on the first direct raw input
request received instead of requiring private flag values, and an empty
raw input event could be sent right after the initialization if we
still want to be informed early on.
--
Rémi Bernon <rbernon(a)codeweavers.com>
July 23, 2019