From: Rémi Bernon rbernon@codeweavers.com
Valuator names aren't well specified, and although they are usually named "Rel X/Y" or "Abs X/Y", there are cases where the names are different.
Lets just assume that the first two valuators are the X/Y axes, as it seems to be generally the case. --- dlls/winex11.drv/mouse.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index 143837adede..bdbd559b107 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -228,26 +228,25 @@ void set_window_cursor( Window window, HCURSOR handle ) /*********************************************************************** * update_relative_valuators */ -static void update_relative_valuators(XIAnyClassInfo **valuators, int n_valuators) +static void update_relative_valuators( XIAnyClassInfo **classes, int num_classes ) { struct x11drv_thread_data *thread_data = x11drv_thread_data(); - int i; + XIValuatorClassInfo *valuator;
thread_data->x_valuator.number = -1; thread_data->y_valuator.number = -1;
- for (i = 0; i < n_valuators; i++) + while (num_classes--) { - XIValuatorClassInfo *class = (XIValuatorClassInfo *)valuators[i]; - if (valuators[i]->type != XIValuatorClass) continue; - if (class->label == x11drv_atom( Rel_X ) || - (!class->label && class->number == 0 && class->mode == XIModeRelative)) - thread_data->x_valuator = *class; - else if (class->label == x11drv_atom( Rel_Y ) || - (!class->label && class->number == 1 && class->mode == XIModeRelative)) - thread_data->y_valuator = *class; + valuator = (XIValuatorClassInfo *)classes[num_classes]; + if (classes[num_classes]->type != XIValuatorClass) continue; + if (valuator->number == 0 && valuator->mode == XIModeRelative) thread_data->x_valuator = *valuator; + if (valuator->number == 1 && valuator->mode == XIModeRelative) thread_data->y_valuator = *valuator; }
+ if (thread_data->x_valuator.number < 0 || thread_data->y_valuator.number < 0) + WARN( "X/Y axis valuators not found, ignoring RawMotion events\n" ); + thread_data->x_valuator.value = 0; thread_data->y_valuator.value = 0; }