Merge remote branch 'whot/for-keith'

This commit is contained in:
Keith Packard 2010-11-24 11:47:33 -08:00
commit 4e0f8f666e
6 changed files with 96 additions and 35 deletions

View File

@ -9,8 +9,10 @@ AM_CFLAGS += $(UDEV_CFLAGS)
libconfig_la_SOURCES += udev.c
libconfig_la_LIBADD = $(UDEV_LIBS)
if XORG
xorgconfddir = $(datadir)/X11/$(XF86CONFIGDIR)
xorgconfd_DATA = 10-evdev.conf
endif
else

View File

@ -324,14 +324,16 @@ countValuators(DeviceEvent *ev, int *first)
for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
{
/* Assume mode of 0th valuator matches XI1 device mode. Stop when the
* event mode changes since XI1 can't handle mixed mode devices.
*/
if (ev->valuators.mode[i] != ev->valuators.mode[0])
break;
if (BitIsOn(ev->valuators.mask, i))
{
/* Assume mode of first_valuator matches XI1 device mode. Stop when the
* event mode changes since XI1 can't handle mixed mode devices.
*/
if (first_valuator > -1 &&
BitIsOn(ev->valuators.mode, i) !=
BitIsOn(ev->valuators.mode, first_valuator))
break;
if (first_valuator == -1)
first_valuator = i;
last_valuator = i;

View File

@ -210,7 +210,7 @@ set_valuators(DeviceIntPtr dev, DeviceEvent* event, ValuatorMask *mask)
if (valuator_mask_isset(mask, i))
{
SetBit(event->valuators.mask, i);
if (dev->valuator->axes[i].mode == Absolute)
if (valuator_get_mode(dev, i) == Absolute)
SetBit(event->valuators.mode, i);
event->valuators.data[i] = valuator_mask_get(mask, i);
event->valuators.data_frac[i] =
@ -1057,14 +1057,18 @@ transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask)
struct pixman_f_vector p;
/* p' = M * p in homogeneous coordinates */
p.v[0] = valuator_mask_get(mask, 0);
p.v[1] = valuator_mask_get(mask, 1);
p.v[0] = (valuator_mask_isset(mask, 0) ? valuator_mask_get(mask, 0) :
dev->last.valuators[0]);
p.v[1] = (valuator_mask_isset(mask, 1) ? valuator_mask_get(mask, 1) :
dev->last.valuators[1]);
p.v[2] = 1.0;
pixman_f_transform_point(&dev->transform, &p);
valuator_mask_set(mask, 0, lround(p.v[0]));
valuator_mask_set(mask, 1, lround(p.v[1]));
if (lround(p.v[0]) != dev->last.valuators[0])
valuator_mask_set(mask, 0, lround(p.v[0]));
if (lround(p.v[1]) != dev->last.valuators[1])
valuator_mask_set(mask, 1, lround(p.v[1]));
}
/**
@ -1139,7 +1143,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
}
if (valuator_mask_isset(&mask, 1))
{
scaled = rescaleValuatorAxis(valuator_mask_get(&mask, 0),
scaled = rescaleValuatorAxis(valuator_mask_get(&mask, 1),
0.0, &y_frac, NULL,
pDev->valuator->axes + 1,
scr->height);
@ -1155,11 +1159,16 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
* should be converted to masked valuators. */
int vals[2];
vals[0] = valuator_mask_isset(&mask, 0) ?
valuator_mask_get(&mask, 0) : pDev->last.valuators[0];
valuator_mask_get(&mask, 0) : 0;
vals[1] = valuator_mask_isset(&mask, 1) ?
valuator_mask_get(&mask, 1) : pDev->last.valuators[1];
valuator_mask_get(&mask, 1) : 0;
accelPointer(pDev, 0, 2, vals, ms);
if (valuator_mask_isset(&mask, 0))
valuator_mask_set(&mask, 0, vals[0]);
if (valuator_mask_isset(&mask, 1))
valuator_mask_set(&mask, 1, vals[1]);
/* The pointer acceleration code modifies the fractional part
* in-place, so we need to extract this information first */
x_frac = pDev->last.remainder[0];
@ -1177,7 +1186,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
if (valuator_mask_isset(&mask, 0))
valuator_mask_set(&mask, 0, x);
if (valuator_mask_isset(&mask, 1))
valuator_mask_set(&mask, 0, y);
valuator_mask_set(&mask, 1, y);
clipValuators(pDev, &mask);
@ -1239,13 +1248,17 @@ GetProximityEvents(EventList *events, DeviceIntPtr pDev, int type, const Valuato
valuator_mask_copy(&mask, mask_in);
/* ignore relative axes for proximity. */
for (i = 0; i < valuator_mask_num_valuators(&mask); i++)
for (i = 0; i < valuator_mask_size(&mask); i++)
{
if (valuator_mask_isset(&mask, i) &&
valuator_get_mode(pDev, i) == Relative)
valuator_mask_unset(&mask, i);
}
/* FIXME: posting proximity events with relative valuators only results
* in an empty event, EventToXI() will fail to convert no event sent
* to client. */
events = UpdateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events);
event = (DeviceEvent *) events->event;

View File

@ -1296,7 +1296,7 @@ xf86ScaleAxis(int Cx,
}
else {
X = 0;
ErrorF ("Divide by Zero in xf86ScaleAxis");
ErrorF ("Divide by Zero in xf86ScaleAxis\n");
}
if (X > to_max)

View File

@ -85,7 +85,11 @@ static void *console_handler;
static void
drain_console(int fd, void *closure)
{
tcflush(fd, TCIOFLUSH);
errno = 0;
if (tcflush(fd, TCIOFLUSH) == -1 && errno == EIO) {
xf86RemoveGeneralHandler(console_handler);
console_handler = NULL;
}
}
void

View File

@ -683,42 +683,82 @@ static void dix_grab_matching(void)
g_assert(rc == TRUE);
}
static void include_byte_padding_macros(void)
static void test_bits_to_byte(int i)
{
int i;
g_test_message("Testing bits_to_bytes()");
/* the macros don't provide overflow protection */
for (i = 0; i < INT_MAX - 7; i++)
{
int expected_bytes;
expected_bytes = (i + 7)/8;
g_assert(bits_to_bytes(i) >= i/8);
g_assert((bits_to_bytes(i) * 8) - i <= 7);
}
g_assert(expected_bytes == bits_to_bytes(i));
}
g_test_message("Testing bytes_to_int32()");
for (i = 0; i < INT_MAX - 3; i++)
{
static void test_bytes_to_int32(int i)
{
int expected_4byte;
expected_4byte = (i + 3)/4;
g_assert(bytes_to_int32(i) <= i);
g_assert((bytes_to_int32(i) * 4) - i <= 3);
}
g_assert(expected_4byte == bytes_to_int32(i));
}
g_test_message("Testing pad_to_int32");
for (i = 0; i < INT_MAX - 3; i++)
{
static void test_pad_to_int32(int i)
{
int expected_bytes;
expected_bytes = ((i + 3)/4) * 4;
g_assert(pad_to_int32(i) >= i);
g_assert(pad_to_int32(i) - i <= 3);
}
g_assert(expected_bytes == pad_to_int32(i));
}
static void include_byte_padding_macros(void)
{
g_test_message("Testing bits_to_bytes()");
/* the macros don't provide overflow protection */
test_bits_to_byte(0);
test_bits_to_byte(1);
test_bits_to_byte(2);
test_bits_to_byte(7);
test_bits_to_byte(8);
test_bits_to_byte(0xFF);
test_bits_to_byte(0x100);
test_bits_to_byte(INT_MAX - 9);
test_bits_to_byte(INT_MAX - 8);
g_test_message("Testing bytes_to_int32()");
test_bytes_to_int32(0);
test_bytes_to_int32(1);
test_bytes_to_int32(2);
test_bytes_to_int32(7);
test_bytes_to_int32(8);
test_bytes_to_int32(0xFF);
test_bytes_to_int32(0x100);
test_bytes_to_int32(0xFFFF);
test_bytes_to_int32(0x10000);
test_bytes_to_int32(0xFFFFFF);
test_bytes_to_int32(0x1000000);
test_bytes_to_int32(INT_MAX - 4);
test_bytes_to_int32(INT_MAX - 3);
g_test_message("Testing pad_to_int32");
test_pad_to_int32(0);
test_pad_to_int32(0);
test_pad_to_int32(1);
test_pad_to_int32(2);
test_pad_to_int32(7);
test_pad_to_int32(8);
test_pad_to_int32(0xFF);
test_pad_to_int32(0x100);
test_pad_to_int32(0xFFFF);
test_pad_to_int32(0x10000);
test_pad_to_int32(0xFFFFFF);
test_pad_to_int32(0x1000000);
test_pad_to_int32(INT_MAX - 4);
test_pad_to_int32(INT_MAX - 3);
}
static void xi_unregister_handlers(void)