Re: [PATCH libinput 1/9] path: keep the udev context around
Hi, On 11/24/2014 01:46 AM, Peter Hutterer wrote: We need it for each device anyway, keep the ref around. Makes error handling a bit easier, we don't need to handle failing udev_new() and reduce the danger of mis-refcounting it. Signed-off-by: Peter Hutterer peter.hutte...@who-t.net Looks good: Reviewed-by: Hans de Goede hdego...@redhat.com Regards, Hans --- src/path.c | 33 +++-- src/path.h | 1 + 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/path.c b/src/path.c index 3752751..f986afd 100644 --- a/src/path.c +++ b/src/path.c @@ -110,22 +110,18 @@ path_seat_get_named(struct path_input *input, } static int -path_get_udev_properties(const char *path, +path_get_udev_properties(struct udev *udev, +const char *path, char **sysname, char **syspath, char **seat_name, char **seat_logical_name) { - struct udev *udev = NULL; struct udev_device *device = NULL; struct stat st; const char *seat; int rc = -1; - udev = udev_new(); - if (!udev) - goto out; - if (stat(path, st) 0) goto out; @@ -147,8 +143,6 @@ path_get_udev_properties(const char *path, out: if (device) udev_device_unref(device); - if (udev) - udev_unref(udev); return rc; } @@ -160,8 +154,12 @@ path_device_enable(struct path_input *input, const char *devnode) char *sysname = NULL, *syspath = NULL; char *seat_name = NULL, *seat_logical_name = NULL; - if (path_get_udev_properties(devnode, sysname, syspath, -seat_name, seat_logical_name) == -1) { + if (path_get_udev_properties(input-udev, +devnode, +sysname, +syspath, +seat_name, +seat_logical_name) == -1) { log_info(input-base, failed to obtain sysname for device '%s'.\n, devnode); @@ -229,6 +227,8 @@ path_input_destroy(struct libinput *input) struct path_input *path_input = (struct path_input*)input; struct path_device *dev, *tmp; + udev_unref(path_input-udev); + list_for_each_safe(dev, tmp, path_input-path_list, link) { free(dev-path); free(dev); @@ -247,20 +247,25 @@ libinput_path_create_context(const struct libinput_interface *interface, void *user_data) { struct path_input *input; + struct udev *udev; if (!interface) return NULL; + udev = udev_new(); + if (!udev) + return NULL; + input = zalloc(sizeof *input); - if (!input) - return NULL; - - if (libinput_init(input-base, interface, + if (!input || + libinput_init(input-base, interface, interface_backend, user_data) != 0) { + udev_unref(udev); free(input); return NULL; } + input-udev = udev; list_init(input-path_list); return input-base; diff --git a/src/path.h b/src/path.h index 779d823..999601b 100644 --- a/src/path.h +++ b/src/path.h @@ -28,6 +28,7 @@ struct path_input { struct libinput base; + struct udev *udev; struct list path_list; }; ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH libinput 2/9] path: split out creating a device into a helper function
Hi, On 11/24/2014 01:46 AM, Peter Hutterer wrote: No functional changes Signed-off-by: Peter Hutterer peter.hutte...@who-t.net Looks good: Reviewed-by: Hans de Goede hdego...@redhat.com Regards, Hans --- src/path.c | 57 - 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/src/path.c b/src/path.c index f986afd..5900775 100644 --- a/src/path.c +++ b/src/path.c @@ -236,6 +236,37 @@ path_input_destroy(struct libinput *input) } +static struct libinput_device * +path_create_device(struct libinput *libinput, + const char *path) +{ + struct path_input *input = (struct path_input*)libinput; + struct path_device *dev; + struct libinput_device *device; + + dev = zalloc(sizeof *dev); + if (!dev) + return NULL; + + dev-path = strdup(path); + if (!dev-path) { + free(dev); + return NULL; + } + + list_insert(input-path_list, dev-link); + + device = path_device_enable(input, dev-path); + + if (!device) { + list_remove(dev-link); + free(dev-path); + free(dev); + } + + return device; +} + static const struct libinput_interface_backend interface_backend = { .resume = path_input_enable, .suspend = path_input_disable, @@ -275,36 +306,12 @@ LIBINPUT_EXPORT struct libinput_device * libinput_path_add_device(struct libinput *libinput, const char *path) { - struct path_input *input = (struct path_input*)libinput; - struct path_device *dev; - struct libinput_device *device; - if (libinput-interface_backend != interface_backend) { log_bug_client(libinput, Mismatching backends.\n); return NULL; } - dev = zalloc(sizeof *dev); - if (!dev) - return NULL; - - dev-path = strdup(path); - if (!dev-path) { - free(dev); - return NULL; - } - - list_insert(input-path_list, dev-link); - - device = path_device_enable(input, dev-path); - - if (!device) { - list_remove(dev-link); - free(dev-path); - free(dev); - } - - return device; + return path_create_device(libinput, path); } LIBINPUT_EXPORT void ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH libinput 3/9] path: store the udev device instead of just the devnode
Hi, On 11/24/2014 01:46 AM, Peter Hutterer wrote: Long-term plan to use more of udev_device here is to better protect us against re-opening a different device that happens to have the same devnode. This now also prints an error message for invalid devices, the log tests are adjusted. Signed-off-by: Peter Hutterer peter.hutte...@who-t.net --- src/path.c | 109 ++--- src/path.h | 2 +- test/log.c | 8 +++-- 3 files changed, 53 insertions(+), 66 deletions(-) diff --git a/src/path.c b/src/path.c index 5900775..175366b 100644 --- a/src/path.c +++ b/src/path.c @@ -109,62 +109,26 @@ path_seat_get_named(struct path_input *input, return NULL; } -static int -path_get_udev_properties(struct udev *udev, -const char *path, -char **sysname, -char **syspath, -char **seat_name, -char **seat_logical_name) -{ - struct udev_device *device = NULL; - struct stat st; - const char *seat; - int rc = -1; - - if (stat(path, st) 0) - goto out; - - device = udev_device_new_from_devnum(udev, 'c', st.st_rdev); - if (!device) - goto out; - - *sysname = strdup(udev_device_get_sysname(device)); - *syspath = strdup(udev_device_get_syspath(device)); - - seat = udev_device_get_property_value(device, ID_SEAT); - *seat_name = strdup(seat ? seat : default_seat); - - seat = udev_device_get_property_value(device, WL_SEAT); - *seat_logical_name = strdup(seat ? seat : default_seat_name); - - rc = 0; - -out: - if (device) - udev_device_unref(device); - return rc; -} - static struct libinput_device * -path_device_enable(struct path_input *input, const char *devnode) +path_device_enable(struct path_input *input, + struct udev_device *udev_device) { struct path_seat *seat; struct evdev_device *device = NULL; char *sysname = NULL, *syspath = NULL; char *seat_name = NULL, *seat_logical_name = NULL; + const char *seat_prop; + const char *devnode; - if (path_get_udev_properties(input-udev, -devnode, -sysname, -syspath, -seat_name, -seat_logical_name) == -1) { - log_info(input-base, -failed to obtain sysname for device '%s'.\n, -devnode); - return NULL; - } + sysname = strdup(udev_device_get_sysname(udev_device)); + syspath = strdup(udev_device_get_syspath(udev_device)); + + seat_prop = udev_device_get_property_value(udev_device, ID_SEAT); + seat_name = strdup(seat_prop ? seat_prop : default_seat); + + seat_prop = udev_device_get_property_value(udev_device, WL_SEAT); + seat_logical_name = strdup(seat_prop ? seat_prop : default_seat_name); + devnode = udev_device_get_devnode(udev_device); seat = path_seat_get_named(input, seat_name, seat_logical_name); @@ -212,7 +176,7 @@ path_input_enable(struct libinput *libinput) struct path_device *dev; list_for_each(dev, input-path_list, link) { - if (path_device_enable(input, dev-path) == NULL) { + if (path_device_enable(input, dev-udev_device) == NULL) { path_input_disable(libinput); return -1; } @@ -230,7 +194,7 @@ path_input_destroy(struct libinput *input) udev_unref(path_input-udev); list_for_each_safe(dev, tmp, path_input-path_list, link) { - free(dev-path); + udev_device_unref(dev-udev_device); free(dev); } @@ -238,7 +202,7 @@ path_input_destroy(struct libinput *input) static struct libinput_device * path_create_device(struct libinput *libinput, - const char *path) + struct udev_device *udev_device) { struct path_input *input = (struct path_input*)libinput; struct path_device *dev; @@ -248,19 +212,15 @@ path_create_device(struct libinput *libinput, if (!dev) return NULL; - dev-path = strdup(path); - if (!dev-path) { - free(dev); - return NULL; - } + dev-udev_device = udev_device_ref(udev_device); list_insert(input-path_list, dev-link); - device = path_device_enable(input, dev-path); + device = path_device_enable(input, udev_device); if (!device) { + udev_device_unref(udev_device); Nitpick, it would be better to use: udev_device_unref(dev-udev_device); (same thing, but clearer signals intent). Otherwise looks good: Reviewed-by: Hans de Goede
Re: [PATCH libinput 4/9] evdev: use a udev_device instead of separate sysname/syspath/devnode
Hi, On 11/24/2014 01:46 AM, Peter Hutterer wrote: Using a udev_device instead of the various bits separately safes us re-initializing udev contexts whenever we need to compare the device. And having the actual udev device makes it a bit easier to ensure that we're not re-initializing a different device as a current one. Signed-off-by: Peter Hutterer peter.hutte...@who-t.net --- src/evdev.c | 85 +++-- src/evdev.h | 9 ++ src/path.c | 11 ++-- src/udev-seat.c | 16 +-- 4 files changed, 46 insertions(+), 75 deletions(-) diff --git a/src/evdev.c b/src/evdev.c index fed66cb..8d457f2 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -240,7 +240,8 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time) if (device-mt.slots[slot].seat_slot != -1) { log_bug_kernel(libinput, %s: Driver sent multiple touch down for the - same slot, device-devnode); + same slot, + udev_device_get_devnode(device-udev_device)); break; } @@ -292,7 +293,8 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time) if (device-abs.seat_slot != -1) { log_bug_kernel(libinput, %s: Driver sent multiple touch down for the - same slot, device-devnode); + same slot, + udev_device_get_devnode(device-udev_device)); break; } @@ -1218,20 +1220,11 @@ evdev_need_mtdev(struct evdev_device *device) static void evdev_tag_device(struct evdev_device *device) { - struct udev *udev; - struct udev_device *udev_device = NULL; + struct udev_device *udev_device; - udev = udev_new(); - if (!udev) - return; - - udev_device = udev_device_new_from_syspath(udev, device-syspath); - if (udev_device) { - if (device-dispatch-interface-tag_device) - device-dispatch-interface-tag_device(device, udev_device); - udev_device_unref(udev_device); - } - udev_unref(udev); + udev_device = device-udev_device; + if (device-dispatch-interface-tag_device) + device-dispatch-interface-tag_device(device, udev_device); Maybe reduce the function to just these 2 lines ? : if (device-dispatch-interface-tag_device) device-dispatch-interface-tag_device(device, device-udev_device); Otherwise looks good: Reviewed-by: Hans de Goede hdego...@redhat.com Regards, Hans } static inline int @@ -1266,6 +1259,7 @@ evdev_configure_device(struct evdev_device *device) int active_slot; int slot; unsigned int i; + const char *devnode = udev_device_get_devnode(device-udev_device); has_rel = 0; has_abs = 0; @@ -1364,7 +1358,7 @@ evdev_configure_device(struct evdev_device *device) device-dispatch = evdev_mt_touchpad_create(device); log_info(libinput, input device '%s', %s is a touchpad\n, -device-devname, device-devnode); +device-devname, devnode); return device-dispatch == NULL ? -1 : 0; } @@ -1397,7 +1391,7 @@ evdev_configure_device(struct evdev_device *device) log_info(libinput, input device '%s', %s is a pointer caps =%s%s%s\n, -device-devname, device-devnode, +device-devname, devnode, has_abs ? absolute-motion : , has_rel ? relative-motion: , has_button ? button : ); @@ -1417,13 +1411,13 @@ evdev_configure_device(struct evdev_device *device) device-seat_caps |= EVDEV_DEVICE_KEYBOARD; log_info(libinput, input device '%s', %s is a keyboard\n, -device-devname, device-devnode); +device-devname, devnode); } if (has_touch !has_button) { device-seat_caps |= EVDEV_DEVICE_TOUCH; log_info(libinput, input device '%s', %s is a touch device\n, -device-devname, device-devnode); +device-devname, devnode); } return 0; @@ -1457,15 +1451,14 @@ evdev_notify_added_device(struct evdev_device *device) struct evdev_device * evdev_device_create(struct libinput_seat *seat, - const char *devnode, -
Re: [PATCH libinput 5/9] evdev: remove a race condition opening the wrong device
Hi, On 11/24/2014 01:46 AM, Peter Hutterer wrote: Potential race condition: - udev notifies us that a udev_device became available - we go for a coffee and chat to the neighbours on the way - the device is unplugged - a new device is plugged in, gets the same devnode - we finish our coffee and come back - open(udev_device_get_devnode()) - new device is now opened as the old device To avoid the above race, we compare the syspath of the device at the open fd with the syspath of the device we originally wanted. If they differ, we fail. evdev_compare_syspath was simply moved up. Signed-off-by: Peter Hutterer peter.hutte...@who-t.net Looks good: Reviewed-by: Hans de Goede hdego...@redhat.com Regards, Hans --- src/evdev.c | 49 ++--- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/evdev.c b/src/evdev.c index 8d457f2..8897cd4 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1449,6 +1449,29 @@ evdev_notify_added_device(struct evdev_device *device) notify_added_device(device-base); } +static int +evdev_device_compare_syspath(struct udev_device *udev_device, int fd) +{ + struct udev *udev = udev_device_get_udev(udev_device); + struct udev_device *udev_device_new; + struct stat st; + int rc = 1; + + if (fstat(fd, st) 0) + goto out; + + udev_device_new = udev_device_new_from_devnum(udev, 'c', st.st_rdev); + if (!udev_device_new) + goto out; + + rc = strcmp(udev_device_get_syspath(udev_device_new), + udev_device_get_syspath(udev_device)); +out: + if (udev_device_new) + udev_device_unref(udev_device_new); + return rc; +} + struct evdev_device * evdev_device_create(struct libinput_seat *seat, struct udev_device *udev_device) @@ -1471,6 +1494,9 @@ evdev_device_create(struct libinput_seat *seat, return NULL; } + if (evdev_device_compare_syspath(udev_device, fd) != 0) + goto err; + device = zalloc(sizeof *device); if (device == NULL) goto err; @@ -1909,29 +1935,6 @@ evdev_device_suspend(struct evdev_device *device) return 0; } -static int -evdev_device_compare_syspath(struct udev_device *udev_device, int fd) -{ - struct udev *udev = udev_device_get_udev(udev_device); - struct udev_device *udev_device_new; - struct stat st; - int rc = 1; - - if (fstat(fd, st) 0) - goto out; - - udev_device_new = udev_device_new_from_devnum(udev, 'c', st.st_rdev); - if (!udev_device_new) - goto out; - - rc = strcmp(udev_device_get_syspath(udev_device_new), - udev_device_get_syspath(udev_device)); -out: - if (udev_device_new) - udev_device_unref(udev_device_new); - return rc; -} - int evdev_device_resume(struct evdev_device *device) { ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH libinput 6/9] udev: optionally pass the seat name into device_added()
Hi, On 11/24/2014 01:46 AM, Peter Hutterer wrote: Prep work for changing seat names on devices. No functional changes. Signed-off-by: Peter Hutterer peter.hutte...@who-t.net Looks good: Reviewed-by: Hans de Goede hdego...@redhat.com Regards, Hans --- src/udev-seat.c | 13 - 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/udev-seat.c b/src/udev-seat.c index 49c8f47..c69d175 100644 --- a/src/udev-seat.c +++ b/src/udev-seat.c @@ -42,11 +42,13 @@ static struct udev_seat * udev_seat_get_named(struct udev_input *input, const char *seat_name); static int -device_added(struct udev_device *udev_device, struct udev_input *input) +device_added(struct udev_device *udev_device, +struct udev_input *input, +const char *seat_name) { struct evdev_device *device; const char *devnode; - const char *device_seat, *seat_name, *output_name; + const char *device_seat, *output_name; const char *calibration_values; float calibration[6]; struct udev_seat *seat; @@ -61,7 +63,8 @@ device_added(struct udev_device *udev_device, struct udev_input *input) devnode = udev_device_get_devnode(udev_device); /* Search for matching logical seat */ - seat_name = udev_device_get_property_value(udev_device, WL_SEAT); + if (!seat_name) + seat_name = udev_device_get_property_value(udev_device, WL_SEAT); if (!seat_name) seat_name = default_seat_name; @@ -161,7 +164,7 @@ udev_input_add_devices(struct udev_input *input, struct udev *udev) continue; } - if (device_added(device, input) 0) { + if (device_added(device, input, NULL) 0) { udev_device_unref(device); udev_enumerate_unref(e); return -1; @@ -193,7 +196,7 @@ evdev_udev_handler(void *data) goto out; if (!strcmp(action, add)) - device_added(udev_device, input); + device_added(udev_device, input, NULL); else if (!strcmp(action, remove)) device_removed(udev_device, input); ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH libinput 7/9] path: optionally pass the seat name into path_device_enable()
Hi, On 11/24/2014 01:46 AM, Peter Hutterer wrote: Prep work for changing seat names on devices. No functional changes. Signed-off-by: Peter Hutterer peter.hutte...@who-t.net Looks good: Reviewed-by: Hans de Goede hdego...@redhat.com Regards, Hans --- src/path.c | 30 ++ 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/path.c b/src/path.c index 9d0632a..fef1d46 100644 --- a/src/path.c +++ b/src/path.c @@ -111,7 +111,8 @@ path_seat_get_named(struct path_input *input, static struct libinput_device * path_device_enable(struct path_input *input, - struct udev_device *udev_device) + struct udev_device *udev_device, + const char *seat_logical_name_override) { struct path_seat *seat; struct evdev_device *device = NULL; @@ -119,12 +120,24 @@ path_device_enable(struct path_input *input, const char *seat_prop; const char *devnode; + devnode = udev_device_get_devnode(udev_device); + seat_prop = udev_device_get_property_value(udev_device, ID_SEAT); seat_name = strdup(seat_prop ? seat_prop : default_seat); - seat_prop = udev_device_get_property_value(udev_device, WL_SEAT); - seat_logical_name = strdup(seat_prop ? seat_prop : default_seat_name); - devnode = udev_device_get_devnode(udev_device); + if (seat_logical_name_override) { + seat_logical_name = strdup(seat_logical_name_override); + } else { + seat_prop = udev_device_get_property_value(udev_device, WL_SEAT); + seat_logical_name = strdup(seat_prop ? seat_prop : default_seat_name); + } + + if (!seat_logical_name) { + log_error(input-base, + failed to create seat name for device '%s'.\n, + devnode); + goto out; + } seat = path_seat_get_named(input, seat_name, seat_logical_name); @@ -170,7 +183,7 @@ path_input_enable(struct libinput *libinput) struct path_device *dev; list_for_each(dev, input-path_list, link) { - if (path_device_enable(input, dev-udev_device) == NULL) { + if (path_device_enable(input, dev-udev_device, NULL) == NULL) { path_input_disable(libinput); return -1; } @@ -196,7 +209,8 @@ path_input_destroy(struct libinput *input) static struct libinput_device * path_create_device(struct libinput *libinput, - struct udev_device *udev_device) + struct udev_device *udev_device, + const char *seat_name) { struct path_input *input = (struct path_input*)libinput; struct path_device *dev; @@ -210,7 +224,7 @@ path_create_device(struct libinput *libinput, list_insert(input-path_list, dev-link); - device = path_device_enable(input, udev_device); + device = path_device_enable(input, udev_device, seat_name); if (!device) { udev_device_unref(udev_device); @@ -287,7 +301,7 @@ libinput_path_add_device(struct libinput *libinput, return NULL; } - device = path_create_device(libinput, udev_device); + device = path_create_device(libinput, udev_device, NULL); udev_device_unref(udev_device); return device; } ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH libinput 8/9] Add libinput_device_set_seat_logical_name() to change seats at runtime
Hi, On 11/24/2014 01:46 AM, Peter Hutterer wrote: The seat of a device is currently immutable, but a device may (in a multi-pointer case) move between different logical seats. Moving it between seats is akin to removing it and re-plugging it, so let's do exactly that. The physical seat name stays immutable. Pro: - device handling after changing a seat remains identical as handling any other device. Con: - tracking a device across seat changes is difficult - this is not an atomic operation, if re-adding the device fails it stays removed from the original seat and is now dead Signed-off-by: Peter Hutterer peter.hutte...@who-t.net Looks good: Reviewed-by: Hans de Goede hdego...@redhat.com Regards, Hans --- src/libinput-private.h | 2 ++ src/libinput.c | 13 + src/libinput.h | 26 ++ src/path.c | 20 src/udev-seat.c| 19 +++ 5 files changed, 80 insertions(+) diff --git a/src/libinput-private.h b/src/libinput-private.h index 8c75d1f..07db7fd 100644 --- a/src/libinput-private.h +++ b/src/libinput-private.h @@ -36,6 +36,8 @@ struct libinput_interface_backend { int (*resume)(struct libinput *libinput); void (*suspend)(struct libinput *libinput); void (*destroy)(struct libinput *libinput); + int (*device_change_seat)(struct libinput_device *device, + const char *seat_name); }; struct libinput { diff --git a/src/libinput.c b/src/libinput.c index 3f5370f..7b94320 100644 --- a/src/libinput.c +++ b/src/libinput.c @@ -1213,6 +1213,19 @@ libinput_device_get_seat(struct libinput_device *device) return device-seat; } +LIBINPUT_EXPORT int +libinput_device_set_seat_logical_name(struct libinput_device *device, + const char *name) +{ + struct libinput *libinput = device-seat-libinput; + + if (name == NULL) + return -1; + + return libinput-interface_backend-device_change_seat(device, + name); +} + LIBINPUT_EXPORT void libinput_device_led_update(struct libinput_device *device, enum libinput_led leds) diff --git a/src/libinput.h b/src/libinput.h index 092b0e7..9c9a313 100644 --- a/src/libinput.h +++ b/src/libinput.h @@ -1373,6 +1373,32 @@ libinput_device_get_seat(struct libinput_device *device); /** * @ingroup device * + * Change the logical seat associated with this device by removing the + * device and adding it to the new seat. + * + * This command is identical to physically unplugging the device, then + * re-plugging it as member of the new seat, + * @ref LIBINPUT_EVENT_DEVICE_REMOVED and @ref LIBINPUT_EVENT_DEVICE_ADDED + * events are sent accordingly. Those events mark the end of the lifetime + * of this device and the start of a new device. + * + * If the logical seat name already exists in the device's physical seat, + * the device is added to this seat. Otherwise, a new seat is created. + * + * @note This change applies to this device until removal or @ref + * libinput_suspend(), whichever happens earlier. + * + * @param device A previously obtained device + * @param name The new logical seat name + * @return 0 on success, non-zero on error + */ +int +libinput_device_set_seat_logical_name(struct libinput_device *device, + const char *name); + +/** + * @ingroup device + * * Update the LEDs on the device, if any. If the device does not have * LEDs, or does not have one or more of the LEDs given in the mask, this * function does nothing. diff --git a/src/path.c b/src/path.c index fef1d46..57f4cc6 100644 --- a/src/path.c +++ b/src/path.c @@ -235,10 +235,30 @@ path_create_device(struct libinput *libinput, return device; } +static int +path_device_change_seat(struct libinput_device *device, + const char *seat_name) +{ + struct libinput *libinput = device-seat-libinput; + struct evdev_device *evdev_device = (struct evdev_device *)device; + struct udev_device *udev_device = NULL; + int rc = -1; + + udev_device = evdev_device-udev_device; + udev_device_ref(udev_device); + libinput_path_remove_device(device); + + if (path_create_device(libinput, udev_device, seat_name) != NULL) + rc = 0; + udev_device_unref(udev_device); + return rc; +} + static const struct libinput_interface_backend interface_backend = { .resume = path_input_enable, .suspend = path_input_disable, .destroy = path_input_destroy, + .device_change_seat = path_device_change_seat, }; LIBINPUT_EXPORT struct libinput * diff --git a/src/udev-seat.c b/src/udev-seat.c index c69d175..f7a3df3 100644 --- a/src/udev-seat.c +++ b/src/udev-seat.c @@ -332,10 +332,29 @@ udev_seat_get_named(struct udev_input *input,
Re: [PATCH libinput 9/9] test: add seat changing tests
Hi, On 11/24/2014 01:46 AM, Peter Hutterer wrote: Signed-off-by: Peter Hutterer peter.hutte...@who-t.net Looks good: Reviewed-by: Hans de Goede hdego...@redhat.com Regards, Hans --- test/path.c | 71 ++- test/udev.c | 78 - 2 files changed, 147 insertions(+), 2 deletions(-) diff --git a/test/path.c b/test/path.c index ecb7839..3a2bf2f 100644 --- a/test/path.c +++ b/test/path.c @@ -162,6 +162,74 @@ START_TEST(path_added_seat) } END_TEST +START_TEST(path_seat_change) +{ + struct litest_device *dev = litest_current_device(); + struct libinput *li = dev-libinput; + struct libinput_event *event; + struct libinput_device *device; + struct libinput_seat *seat1, *seat2; + const char *seat1_name; + const char *seat2_name = new seat; + int rc; + + libinput_dispatch(li); + + event = libinput_get_event(li); + ck_assert_int_eq(libinput_event_get_type(event), +LIBINPUT_EVENT_DEVICE_ADDED); + + device = libinput_event_get_device(event); + libinput_device_ref(device); + + seat1 = libinput_device_get_seat(device); + libinput_seat_ref(seat1); + + seat1_name = libinput_seat_get_logical_name(seat1); + libinput_event_destroy(event); + + litest_drain_events(li); + + rc = libinput_device_set_seat_logical_name(device, + seat2_name); + ck_assert_int_eq(rc, 0); + + libinput_dispatch(li); + + event = libinput_get_event(li); + ck_assert(event != NULL); + + ck_assert_int_eq(libinput_event_get_type(event), +LIBINPUT_EVENT_DEVICE_REMOVED); + + ck_assert(libinput_event_get_device(event) == device); + libinput_event_destroy(event); + + event = libinput_get_event(li); + ck_assert(event != NULL); + ck_assert_int_eq(libinput_event_get_type(event), +LIBINPUT_EVENT_DEVICE_ADDED); + ck_assert(libinput_event_get_device(event) != device); + libinput_device_unref(device); + + device = libinput_event_get_device(event); + seat2 = libinput_device_get_seat(device); + + ck_assert_str_ne(libinput_seat_get_logical_name(seat2), +seat1_name); + ck_assert_str_eq(libinput_seat_get_logical_name(seat2), +seat2_name); + libinput_event_destroy(event); + + libinput_seat_unref(seat1); + + /* litest: swap the new device in, so cleanup works */ + libinput_device_unref(dev-libinput_device); + libinput_device_ref(device); + dev-libinput_device = device; +} +END_TEST + START_TEST(path_added_device) { struct litest_device *dev = litest_current_device(); @@ -805,7 +873,8 @@ main(int argc, char **argv) litest_add_no_device(path:suspend, path_add_device_suspend_resume); litest_add_no_device(path:suspend, path_add_device_suspend_resume_fail); litest_add_no_device(path:suspend, path_add_device_suspend_resume_remove_device); - litest_add_for_device(path:seat events, path_added_seat, LITEST_SYNAPTICS_CLICKPAD); + litest_add_for_device(path:seat, path_added_seat, LITEST_SYNAPTICS_CLICKPAD); + litest_add_for_device(path:seat, path_seat_change, LITEST_SYNAPTICS_CLICKPAD); litest_add(path:device events, path_added_device, LITEST_ANY, LITEST_ANY); litest_add(path:device events, path_device_sysname, LITEST_ANY, LITEST_ANY); litest_add_for_device(path:device events, path_add_device, LITEST_SYNAPTICS_CLICKPAD); diff --git a/test/udev.c b/test/udev.c index 9520663..f5d2c88 100644 --- a/test/udev.c +++ b/test/udev.c @@ -175,6 +175,81 @@ START_TEST(udev_added_seat_default) } END_TEST +/** + * This test only works if there's at least one device in the system that is + * assigned the default seat. Should cover the 99% case. + */ +START_TEST(udev_change_seat) +{ + struct libinput *li; + struct udev *udev; + struct libinput_event *event; + struct libinput_device *device; + struct libinput_seat *seat1, *seat2; + const char *seat1_name; + const char *seat2_name = new seat; + int rc; + + udev = udev_new(); + ck_assert(udev != NULL); + + li = libinput_udev_create_context(simple_interface, NULL, udev); + ck_assert(li != NULL); + ck_assert_int_eq(libinput_udev_assign_seat(li, seat0), 0); + libinput_dispatch(li); + + event = libinput_get_event(li); + ck_assert(event != NULL); + + ck_assert_int_eq(libinput_event_get_type(event), +LIBINPUT_EVENT_DEVICE_ADDED); + + device = libinput_event_get_device(event); + libinput_device_ref(device); + + seat1 = libinput_device_get_seat(device); + libinput_seat_ref(seat1); + +
Re: [PATCH v1 weston 05/11] tests: Allow tests to use customized command line parameters
On Fri, 21 Nov 2014 12:38:35 -0800 Bryce Harrington br...@osg.samsung.com wrote: On Fri, Nov 21, 2014 at 04:56:03PM +0200, Pekka Paalanen wrote: On Wed, 19 Nov 2014 15:06:20 -0800 Bryce Harrington br...@osg.samsung.com wrote: From: Derek Foreman der...@osg.samsung.com Tests will now return the extra command line parameters they need when run with --params Signed-off-by: Bryce Harrington br...@osg.samsung.com --- tests/weston-test-runner.c | 8 tests/weston-tests-env | 1 + 2 files changed, 9 insertions(+) diff --git a/tests/weston-test-runner.c b/tests/weston-test-runner.c index ef45bae..ce0a670 100644 --- a/tests/weston-test-runner.c +++ b/tests/weston-test-runner.c @@ -34,6 +34,8 @@ #define SKIP 77 +char __attribute__((weak)) *server_parameters=; + extern const struct weston_test __start_test_section, __stop_test_section; static const struct weston_test * @@ -154,6 +156,12 @@ int main(int argc, char *argv[]) exit(EXIT_SUCCESS); } + if (strcmp(testname, --params) == 0 || + strcmp(testname, -p) == 0) { + printf(%s, server_parameters); + exit(EXIT_SUCCESS); + } + t = find_test(argv[1]); if (t == NULL) { fprintf(stderr, unknown test: \%s\\n, argv[1]); diff --git a/tests/weston-tests-env b/tests/weston-tests-env index e332354..aaf3ee1 100755 --- a/tests/weston-tests-env +++ b/tests/weston-tests-env @@ -46,5 +46,6 @@ case $TESTNAME in --shell=$SHELL_PLUGIN \ --log=$SERVERLOG \ --modules=$TEST_PLUGIN,$XWAYLAND_PLUGIN \ + $($abs_builddir/$TESTNAME --params) \ $OUTLOG esac Hi, this is pretty clever. I do wonder though if we are going to need a test-specific weston.ini at some point, too. If we do, do we also need to control command line options? Well, apart from specifying the config file location. There are three different external, direct mechanisms for adjusting weston's behavior: * command line options and parameters * weston.ini config file * environment variables Now, afaik we don't have any policies that one of these should be preferred and/or a superset of the others, so presumably future tests are going to want to test settings against any of the three mechanisms. Which means we will need to enable tests to have control over server command line options, environment variables, and weston.ini. If we were to set as a policy that, say, all command line options (and maybe environment variables) must have an equivalent setting in weston.ini, then we could provide only that interface inside tests. This would simplify things from a testing perspective, but it would require the rest of the project to adhere to this constraint. OTOH, we could take the inverse route, and add a command line option that allows setting/overriding any arbitrary parameter that can be set in weston.ini. (We took this approach in Inkscape with a --verb command, that ended up handy both for testing and for other mechanized uses of Inkscape.) Mm, yes, I'm not sure which way to go. Currently Weston does not have a command line option to read a specific config file, but there is --no-config. Adding a standard mapping from all weston.ini options to command line options would be fairly straightforward I assume, something like '-c/--conf=section:key=value' and easy to document. The problem with command line options is that we do not pass them to helper clients. Helpers like weston-desktop-shell just parse weston.ini on their own. I'm not sure even --no-config gets propagated to the helpers. Something should probably be done to tie the helpers better to the compositor's config, however that is received. From security perspective, there is no difference between command line options and config file, is there? OTOH, crafting custom config files at test runtime is a bit labourious. Environment variables we probably need to check case by case. I think few are because we didn't have a way to give any custom options to Weston from the tests. With respect to the environment variables, fortunately there's not too many of them so far. I've started compiling a list and documenting what they do. Excellent! While this patch is fine for now, we are probably going to need something more flexible soon. Currently we only run tests on a single backend at a time, and a single shell at a time. There will become time when we need to test different shell plugins. Oh hey, but this could also work for shell plugins, as tests would likely be shell-specific. It might also be nice to have a bit of heuristics and by default run on all backends that might work: - always headless with each
Re: [PATCH 2/2] touchpad: Add edge-scrolling support
Hi, On 11/20/2014 07:19 AM, Peter Hutterer wrote: On Wed, Nov 19, 2014 at 11:50:13AM +0100, Hans de Goede wrote: [...] + + switch (tp-model) { + case MODEL_SYNAPTICS: + edge_width = width * .07; + edge_height = height * .07; + break; + case MODEL_ALPS: + edge_width = width * .15; + edge_height = height * .15; + break; + case MODEL_APPLETOUCH: + case MODEL_UNIBODY_MACBOOK: the unibody macbooks already had a clickpad, so this isn't needed + edge_width = width * .085; + edge_height = height * .085; + break; + default: + edge_width = width * .04; + edge_height = height * .054; + } fwiw, there is a bit of history there and many oddities are based on a the edges in synaptics being 'wrong'. the kernel exports the synaptics dimensions as the coordinates produced by 'an average finger', but it's not hard to go beyond min/max. iirc for alps and other devices the edges are the actual edges (and for the T440-style synaptics pads that we manually fixed up). Hence the need for different edge zones on synaptics. And the default numbers come from the synaptics user interface guide. Typical bezel limits: x 1472–5472 y 1408–4448 Typical edge margins: x 1632–5312 y 1568–4288 i.e. 4% and 5.4% are interpolated from those so in short, we don't need MODEL_SYNAPTICS, it's covered by the defaults. that just leaves APPLETOUCH and ALPS, I wonder if these have resolutions set (the synaptics code pre-dates resolution support in the kernel). if so, just defining a sensible size for the edge is enough (10mm?). or based on the diagonal. As also mentioned in a private mail not all alps devices have resolution set, so at least for some devices we will need to take a percentage of width / height (no idea why you mention diagonal here). pls see comments in the other email static int @@ -1096,6 +1133,9 @@ tp_init(struct tp_dispatch *tp, if (tp_init_scroll(tp) != 0) return -1; + if (tp_edge_scroll_init(tp, device) != 0) + return -1; tp_scroll_init() - tp_edge_scroll_init() + device-seat_caps |= EVDEV_DEVICE_POINTER; return 0; @@ -1239,6 +1279,7 @@ evdev_mt_touchpad_create(struct evdev_device *device) tp-model = tp_get_model(device); + device-dispatch = tp-base; I guess this is needed for some check or another? if so, can we either pass in the data that's needed, or alternatively make it consistent that the create method sets device-dispatch for the fallback interface as well. This is needed because the initial value for tp-scroll.mode is set by calling tp_scroll_config_scroll_mode_get_default_mode(device). yeah, I think we need to wrap this differently. The current approach works, but it's a bit of a cardhouse. specifically, in a failure case the order of events is: evdev_mt_touchpad_create() sets device-dispatch but returns NULL evdev_configure_device() takes the NULL and overwrites device-dispatch evdev_configure_device() calls evdev_device_destroy() which frees device-dispatch so again, it works right now but if we ever rearrange evdev_configure_device() we'll be dealing with a freed pointer here. and the failure case isn't easy to test for. simple way to split this is to have an inline that takes the tp_dispatch and is called from get_default_mode() and tp_init_touch(). Ok, fixed as suggested for V3. Regards, Hans ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH v1 weston 06/11] tests: Add screenshot recording to weston-test
On Wed, 19 Nov 2014 15:06:21 -0800 Bryce Harrington br...@osg.samsung.com wrote: From: Derek Foreman der...@osg.samsung.com Adds wl_test_record_screenshot() to weston test. This commit also adds a dependency on cairo to weston-test to use it for writing PNG files. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=83981 Signed-off-by: Bryce Harrington br...@osg.samsung.com Hi, could we use a wl_shm-based wl_buffer instead of a file, please? That way we can simply relay the pixels as is to the test client, which can then compare without compressing and decompressing from PNG first. For an example how to do this, see Weston's screenshooter protocol and implementation. I think you also want to specify in the record_screenshot request: - which output to capture (in case there are multiple) - the rectangular sub-region that must be contained in the output (which you already do with the clip coords in a later patch, so that should be squashed here) Synchronization cannot be done with wl_display_roundtrip, so you need an explicit event for that. The best would be to create a new protocol object on record_screenshot request, which then delivers the event and self-destructs, like wl_callback. You could just use wl_callback, but in principle we should avoid new use cases for wl_callback due to the design issues. Please also document carefully in which orientation the screenshot is taken and how the clip coords are interpreted, in case some output_scale/transform are in effect. Or if you rely on the renderer's read_pixels() convention, I hope that is documented somewhere... Btw. there is a small danger in linking Cairo to the compositor. GL-renderer uses GLESv2, but if CAIRO_LIBS contains cairo-gl.so linking to libGL, it might explode... or maybe not because of no RTLD_GLOBAL... or maybe it could, I don't know. So I'd just avoid that. :-) I see the test interface has been extended before without bumping the revision... but we probably should bump it, to not give a bad example. Thanks, pq --- Makefile.am | 4 +-- protocol/wayland-test.xml | 3 +++ tests/weston-test.c | 68 +++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 1e7cc81..26dd473 100644 --- a/Makefile.am +++ b/Makefile.am @@ -881,7 +881,7 @@ noinst_PROGRAMS +=\ matrix-test test_module_ldflags = \ - -module -avoid-version -rpath $(libdir) $(COMPOSITOR_LIBS) + -module -avoid-version -rpath $(libdir) $(COMPOSITOR_LIBS) $(CAIRO_LIBS) surface_global_test_la_SOURCES = tests/surface-global-test.c surface_global_test_la_LDFLAGS = $(test_module_ldflags) @@ -893,7 +893,7 @@ surface_test_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS) weston_test_la_LIBADD = $(COMPOSITOR_LIBS) libshared.la weston_test_la_LDFLAGS = $(test_module_ldflags) -weston_test_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS) +weston_test_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS) $(CAIRO_CFLAGS) weston_test_la_SOURCES = tests/weston-test.c nodist_weston_test_la_SOURCES = \ protocol/wayland-test-protocol.c\ diff --git a/protocol/wayland-test.xml b/protocol/wayland-test.xml index 18b6625..a22a6ac 100644 --- a/protocol/wayland-test.xml +++ b/protocol/wayland-test.xml @@ -58,5 +58,8 @@ event name=n_egl_buffers arg name=n type=uint/ /event +request name=record_screenshot + arg name=basename type=string/ +/request /interface /protocol diff --git a/tests/weston-test.c b/tests/weston-test.c index f1e45c1..16f20c6 100644 --- a/tests/weston-test.c +++ b/tests/weston-test.c @@ -35,6 +35,8 @@ #include EGL/eglext.h #endif /* ENABLE_EGL */ +#include cairo.h + struct weston_test { struct weston_compositor *compositor; struct weston_layer layer; @@ -235,6 +237,71 @@ get_n_buffers(struct wl_client *client, struct wl_resource *resource) wl_test_send_n_egl_buffers(resource, n_buffers); } +static void +dump_image(const char *filename, int x, int y, uint32_t *image) +{ + cairo_surface_t *surface, *flipped; + cairo_t *cr; + + surface = cairo_image_surface_create_for_data((unsigned char *)image, + CAIRO_FORMAT_ARGB32, + x, y, x * 4); + flipped = cairo_surface_create_similar_image(surface, CAIRO_FORMAT_ARGB32, x, y); + + cr = cairo_create(flipped); + cairo_translate(cr, 0.0, y); + cairo_scale(cr, 1.0, -1.0); + cairo_set_source_surface(cr, surface, 0, 0); + cairo_paint(cr); + cairo_destroy(cr); + cairo_surface_destroy(surface); + + cairo_surface_write_to_png(flipped, filename); + cairo_surface_destroy(flipped); +} + +static void +record_screenshot(struct wl_client *client, struct wl_resource
[PATCH libinput v3 1/3] touchpad: Move 2 finger scrolling functions to above tp_process_state()
This is purely a code move, this is a preparation patch for adding edge scrolling support. Signed-off-by: Hans de Goede hdego...@redhat.com --- src/evdev-mt-touchpad.c | 118 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index c3d1d9e..7a1c32d 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -399,6 +399,65 @@ tp_palm_detect(struct tp_dispatch *tp, struct tp_touch *t, uint64_t time) } static void +tp_post_twofinger_scroll(struct tp_dispatch *tp, uint64_t time) +{ + struct tp_touch *t; + int nchanged = 0; + double dx = 0, dy =0; + double tmpx, tmpy; + + tp_for_each_touch(tp, t) { + if (tp_touch_active(tp, t) t-dirty) { + nchanged++; + tp_get_delta(t, tmpx, tmpy); + + dx += tmpx; + dy += tmpy; + } + /* Stop spurious MOTION events at the end of scrolling */ + t-is_pointer = false; + } + + if (nchanged == 0) + return; + + dx /= nchanged; + dy /= nchanged; + + tp_filter_motion(tp, dx, dy, time); + + evdev_post_scroll(tp-device, time, dx, dy); +} + +static int +tp_post_scroll_events(struct tp_dispatch *tp, uint64_t time) +{ + struct tp_touch *t; + int nfingers_down = 0; + + if (tp-scroll.method != LIBINPUT_CONFIG_SCROLL_2FG) + return 0; + + /* No scrolling during tap-n-drag */ + if (tp_tap_dragging(tp)) + return 0; + + /* Only count active touches for 2 finger scrolling */ + tp_for_each_touch(tp, t) { + if (tp_touch_active(tp, t)) + nfingers_down++; + } + + if (nfingers_down != 2) { + evdev_stop_scroll(tp-device, time); + return 0; + } + + tp_post_twofinger_scroll(tp, time); + return 1; +} + +static void tp_process_state(struct tp_dispatch *tp, uint64_t time) { struct tp_touch *t; @@ -467,65 +526,6 @@ tp_post_process_state(struct tp_dispatch *tp, uint64_t time) } static void -tp_post_twofinger_scroll(struct tp_dispatch *tp, uint64_t time) -{ - struct tp_touch *t; - int nchanged = 0; - double dx = 0, dy =0; - double tmpx, tmpy; - - tp_for_each_touch(tp, t) { - if (tp_touch_active(tp, t) t-dirty) { - nchanged++; - tp_get_delta(t, tmpx, tmpy); - - dx += tmpx; - dy += tmpy; - } - /* Stop spurious MOTION events at the end of scrolling */ - t-is_pointer = false; - } - - if (nchanged == 0) - return; - - dx /= nchanged; - dy /= nchanged; - - tp_filter_motion(tp, dx, dy, time); - - evdev_post_scroll(tp-device, time, dx, dy); -} - -static int -tp_post_scroll_events(struct tp_dispatch *tp, uint64_t time) -{ - struct tp_touch *t; - int nfingers_down = 0; - - if (tp-scroll.method != LIBINPUT_CONFIG_SCROLL_2FG) - return 0; - - /* No scrolling during tap-n-drag */ - if (tp_tap_dragging(tp)) - return 0; - - /* Only count active touches for 2 finger scrolling */ - tp_for_each_touch(tp, t) { - if (tp_touch_active(tp, t)) - nfingers_down++; - } - - if (nfingers_down != 2) { - evdev_stop_scroll(tp-device, time); - return 0; - } - - tp_post_twofinger_scroll(tp, time); - return 1; -} - -static void tp_post_events(struct tp_dispatch *tp, uint64_t time) { struct tp_touch *t = tp_current_touch(tp); -- 2.1.0 ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
[PATCH libinput v3 2/3] touchpad: Add code to get the touchpad model / manufacturer
This is useful to know in some cases, it is e.g. necessary to figure out which percentage of a touchpads range to use as edge for edge-scrolling. Note this is a slightly cleaned up copy of the same code in xf86-input-synaptics. Signed-off-by: Hans de Goede hdego...@redhat.com --- src/evdev-mt-touchpad.c | 36 src/evdev-mt-touchpad.h | 10 ++ 2 files changed, 46 insertions(+) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 7a1c32d..6d4b583 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -1146,6 +1146,40 @@ tp_change_to_left_handed(struct evdev_device *device) device-buttons.left_handed = device-buttons.want_left_handed; } +struct model_lookup_t { + uint16_t vendor; + uint16_t product_start; + uint16_t product_end; + enum touchpad_model model; +}; + +static struct model_lookup_t model_lookup_table[] = { + { 0x0002, 0x0007, 0x0007, MODEL_SYNAPTICS }, + { 0x0002, 0x0008, 0x0008, MODEL_ALPS }, + { 0x0002, 0x000e, 0x000e, MODEL_ELANTECH }, + { 0x05ac, 0, 0x0222, MODEL_APPLETOUCH }, + { 0x05ac, 0x0223, 0x0228, MODEL_UNIBODY_MACBOOK }, + { 0x05ac, 0x0229, 0x022b, MODEL_APPLETOUCH }, + { 0x05ac, 0x022c, 0x, MODEL_UNIBODY_MACBOOK }, + { 0, 0, 0, 0 } +}; + +static enum touchpad_model +tp_get_model(struct evdev_device *device) +{ + struct model_lookup_t *lookup; + uint16_t vendor = libevdev_get_id_vendor(device-evdev); + uint16_t product = libevdev_get_id_product(device-evdev); + + for (lookup = model_lookup_table; lookup-vendor; lookup++) { + if (lookup-vendor == vendor + lookup-product_start = product + product = lookup-product_end) + return lookup-model; + } + return MODEL_UNKNOWN; +} + struct evdev_dispatch * evdev_mt_touchpad_create(struct evdev_device *device) { @@ -1155,6 +1189,8 @@ evdev_mt_touchpad_create(struct evdev_device *device) if (!tp) return NULL; + tp-model = tp_get_model(device); + if (tp_init(tp, device) != 0) { tp_destroy(tp-base); return NULL; diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index 11c4d49..7f3ce49 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -42,6 +42,15 @@ enum touchpad_event { TOUCHPAD_EVENT_BUTTON_RELEASE = (1 2), }; +enum touchpad_model { + MODEL_UNKNOWN = 0, + MODEL_SYNAPTICS, + MODEL_ALPS, + MODEL_APPLETOUCH, + MODEL_ELANTECH, + MODEL_UNIBODY_MACBOOK +}; + enum touch_state { TOUCH_NONE = 0, TOUCH_BEGIN, @@ -156,6 +165,7 @@ struct tp_dispatch { unsigned int slot; /* current slot */ bool has_mt; bool semi_mt; + enum touchpad_model model; unsigned int real_touches; /* number of slots */ unsigned int ntouches; /* no slots inc. fakes */ -- 2.1.0 ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH libinput v2 3/3] touchpad: Add edge-scrolling support
Hi, On 11/21/2014 01:29 AM, Peter Hutterer wrote: On Thu, Nov 20, 2014 at 10:34:51AM +0100, Hans de Goede wrote: [...] +int +tp_edge_scroll_init(struct tp_dispatch *tp, struct evdev_device *device) +{ + struct tp_touch *t; + int width, height; + int edge_width, edge_height; + + width = device-abs.absinfo_x-maximum - device-abs.absinfo_x-minimum; + height = device-abs.absinfo_y-maximum - device-abs.absinfo_y-minimum; + + switch (tp-model) { + case MODEL_SYNAPTICS: + edge_width = width * .07; + edge_height = height * .07; + break; + case MODEL_ALPS: + edge_width = width * .15; + edge_height = height * .15; + break; + case MODEL_APPLETOUCH: + case MODEL_UNIBODY_MACBOOK: unless there's one I didn't find in my quick search, the unibodies all had clickpads so we should skip this here and maybe leave a comment for that. But keep the APPLETOUCH ? yes, from what I remember (and quick googling seems to confirm this), the ones with appletouch were e.g. the Core 2 Duo macbooks. Which only had one mouse button but weren't clickpads yet. + edge_width = width * .085; + edge_height = height * .085; + break; + default: + edge_width = width * .04; + edge_height = height * .054; make MODEL_SYNAPTICS the same as default please So use .04 and .054 for synaptics too, and drop the SYNAPTICS case ? yes please. It might be worth mentioning in a comment that for the *40 series, the edges are the absolute edges (not the recommended edges), but since libinput doesn't care about clickpad edges we ignore them here. Ok, both fixed for v3, including adding the suggested comments. Regards, Hans ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH v1 weston 07/11] tests: Add a fadein test
On Wed, 19 Nov 2014 15:06:22 -0800 Bryce Harrington br...@osg.samsung.com wrote: This also serves as a proof of concept of the screen capture functionality and as a demo for snapshot-based rendering verification. Signed-off-by: Bryce Harrington br...@osg.samsung.com --- Makefile.am | 7 +- tests/fadein-test.c | 64 + 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 tests/fadein-test.c diff --git a/Makefile.am b/Makefile.am index 26dd473..c3dfa10 100644 --- a/Makefile.am +++ b/Makefile.am @@ -852,7 +852,8 @@ weston_tests =\ text.weston \ presentation.weston \ roles.weston\ - subsurface.weston + subsurface.weston \ + fadein.weston AM_TESTS_ENVIRONMENT = \ @@ -954,6 +955,10 @@ subsurface_weston_SOURCES = tests/subsurface-test.c subsurface_weston_CFLAGS = $(AM_CFLAGS) $(TEST_CLIENT_CFLAGS) subsurface_weston_LDADD = libtest-client.la +fadein_weston_SOURCES = tests/fadein-test.c +fadein_weston_CFLAGS = $(AM_CFLAGS) $(TEST_CLIENT_CFLAGS) +fadein_weston_LDADD = libtest-client.la + presentation_weston_SOURCES = tests/presentation-test.c nodist_presentation_weston_SOURCES = \ protocol/presentation_timing-protocol.c \ diff --git a/tests/fadein-test.c b/tests/fadein-test.c new file mode 100644 index 000..a6c284f --- /dev/null +++ b/tests/fadein-test.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2014 Samsung + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the copyright holders not be used in + * advertising or publicity pertaining to distribution of the software + * without specific, written prior permission. The copyright holders make + * no representations about the suitability of this software for any + * purpose. It is provided as is without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include config.h + +#include unistd.h +#include stdio.h + +#include weston-test-client-helper.h + +char *server_parameters=--use-pixman --width=320 --height=240; + +static char* +output_filename(const char* basename) { + static const char *path = ./; + char *filename; + +if (asprintf(filename, %s%s, path, basename) 0) + filename = NULL; + + return filename; +} + +TEST(fadein) +{ + struct client *client; + char basename[32]; + char *out_path; + int i; + + client = client_create(100, 100, 100, 100); + assert(client); + + for (i = 0; i 6; i++) { + snprintf(basename, sizeof basename, fadein-%02d, i); + out_path = output_filename(basename); + + wl_test_record_screenshot(client-test-wl_test, out_path); + client_roundtrip(client); + free (out_path); + + usleep(25); + } + +} Hi, where is the verification promised in the commit message? ;-) I think it is bad to rely on delays/timers. We need something more deterministic: a protocol to drive the (headless) repaint. We probably need the headless repaint to not run on its own, but strictly when requested by the test client. Additionally, we probably want to carry a page flip completion timestamp in that request, and have the compositor use the timestamp. That way the test client can actually drive the in-compositor animations, because it is in control of the clock and framerate. That should make the fade-in test reliable, and it will help with Presentation testing too. The client driven repaint likely needs to be enabled per-test. If a test attempts to enable it, but the compositor still does not advertise the support(!) in protocol, the test should skip. This way real hardware backends can skip these tests automatically, as they cannot (or not implemented yet) support client driven repaint. How would that sound? As a first proof of concept screenshooting test, I'd prefer something that doesn't depend on timings at all, so we can add the screenshooting sooner, and the client driven repaint later if that
Re: [PATCH v1 weston 09/11] tests: Add support for comparing output against reference images
On Wed, 19 Nov 2014 15:06:24 -0800 Bryce Harrington br...@osg.samsung.com wrote: Steal Cairo's files_equal() routine to do byte comparison of the rendered files. Note that since the clock time will change run to run we can only compare against the first frame (which will be black). Not even the first frame is actually guaranteed to be black, I think. It's just luck at this point. Signed-off-by: Bryce Harrington br...@osg.samsung.com --- tests/fadein-test.c | 31 +++ tests/weston-test-client-helper.c | 33 + tests/weston-test-client-helper.h | 5 + 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/tests/fadein-test.c b/tests/fadein-test.c index a6c284f..965bb0a 100644 --- a/tests/fadein-test.c +++ b/tests/fadein-test.c @@ -24,27 +24,40 @@ #include unistd.h #include stdio.h +#include stdbool.h #include weston-test-client-helper.h char *server_parameters=--use-pixman --width=320 --height=240; static char* -output_filename(const char* basename) { +output_filename(const char* basename, int head) { static const char *path = ./; char *filename; -if (asprintf(filename, %s%s, path, basename) 0) +if (asprintf(filename, %s%s-%d.png, path, basename, head) 0) filename = NULL; return filename; } +static char* +reference_filename(const char* basename, int head) { +static const char *path = ./tests/reference/; +char *filename; + +if (asprintf(filename, %s%s-%d.png, path, basename, head) 0) +filename = NULL; + +return filename; +} + TEST(fadein) { struct client *client; char basename[32]; char *out_path; + char *ref_path; int i; client = client_create(100, 100, 100, 100); @@ -52,11 +65,21 @@ TEST(fadein) for (i = 0; i 6; i++) { snprintf(basename, sizeof basename, fadein-%02d, i); - out_path = output_filename(basename); + // FIXME: Iterate over all heads + out_path = output_filename(basename, 0); + ref_path = reference_filename(basename, 0); - wl_test_record_screenshot(client-test-wl_test, out_path); + // FIXME: Would be preferred to pass in out_path rather than basename here... + wl_test_record_screenshot(client-test-wl_test, basename); client_roundtrip(client); + if (i == 0) { + if (files_equal(out_path, ref_path)) + printf(%s is correct\n, out_path); + else + printf(%s doesn't match reference %s\n, out_path, ref_path); + } free (out_path); + free (ref_path); usleep(25); } diff --git a/tests/weston-test-client-helper.c b/tests/weston-test-client-helper.c index 79097fa..72834e4 100644 --- a/tests/weston-test-client-helper.c +++ b/tests/weston-test-client-helper.c @@ -22,6 +22,7 @@ #include config.h +#include stdbool.h #include stdlib.h #include stdio.h #include string.h @@ -624,3 +625,35 @@ client_create(int x, int y, int width, int height) return client; } + +bool +files_equal(const char *test_filename, const char* ref_filename) +{ +FILE *test, *ref; +int t, p; + +if (test_filename == NULL || ref_filename == NULL) +return false; + +test = fopen (test_filename, rb); +if (test == NULL) +return false; + +ref = fopen (ref_filename, rb); +if (ref == NULL) { +fclose (test); +return false; +} + +do { +t = getc (test); +p = getc (ref); +if (t != p) +break; +} while (t != EOF p != EOF); + +fclose (test); +fclose (ref); + +return t == p; /* both EOF */ +} Byte by byte comparison on the raw PNG data, I didn't expect that. :-) Well, this needs a rewrite with wl_buffer screenshots, and there we naturally get a chance to apply some fuzz for matching as needed. Thanks, pq diff --git a/tests/weston-test-client-helper.h b/tests/weston-test-client-helper.h index 684afc6..20e08b1 100644 --- a/tests/weston-test-client-helper.h +++ b/tests/weston-test-client-helper.h @@ -26,6 +26,8 @@ #include config.h #include assert.h +#include stdbool.h + #include weston-test-runner.h #include wayland-test-client-protocol.h @@ -135,4 +137,7 @@ void expect_protocol_error(struct client *client, const struct wl_interface *intf, uint32_t code); +bool +files_equal(const char *file_1, const char *file_2); + #endif ___ wayland-devel
Re: [PATCH v1 weston 11/11] tests: Construct the filename external to wl_test_record_screenshot
On Wed, 19 Nov 2014 15:06:26 -0800 Bryce Harrington br...@osg.samsung.com wrote: We need to use the output filename when we do a comparison with the appropriate reference image, so move the filename construction to the caller of record_screenshot() instead. Doing this also requires externalizing the output iteration loop since we want the output number to be recorded in the filename. In most cases this won't matter since we will just have a single head anyway; plus, in cases where we do have multiple heads we could well be caring only about the contents of the Nth head rather than all of them. The fadein test doesn't care about multi-head so no need to traverse the list; we'll look just at head #0. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=83987 Signed-off-by: Bryce Harrington br...@osg.samsung.com --- protocol/wayland-test.xml | 3 +- tests/fadein-test.c | 40 ++--- tests/weston-test-client-helper.c | 34 + tests/weston-test-client-helper.h | 6 tests/weston-test.c | 62 --- 5 files changed, 83 insertions(+), 62 deletions(-) diff --git a/protocol/wayland-test.xml b/protocol/wayland-test.xml index 93fbc16..4c289a6 100644 --- a/protocol/wayland-test.xml +++ b/protocol/wayland-test.xml @@ -59,7 +59,8 @@ arg name=n type=uint/ /event request name=record_screenshot - arg name=basename type=string/ + arg name=filename type=string/ + arg name=head type=uint/ I wonder if using the head index is stable enough. How about using a wl_output object instead? That would be more predictable, if we one day start testing output hotplug, with protocol in the test interface to add and remove outputs. Thanks, pq arg name=clip_x type=uint/ arg name=clip_y type=uint/ arg name=clip_width type=uint/ ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH v1 weston 00/11] Headless rendering testing
On Wed, 19 Nov 2014 15:06:15 -0800 Bryce Harrington br...@osg.samsung.com wrote: This set of patches by Derek and I implement functionality to do screenshot-based testing of wayland. The idea is to allow tests to render the desktop to memory using Pixman, apply an optional clipping mask via Cairo, and store the image to disk as a PNG file. A pixel checker routine is included which just checks that the files are bit-for-bit equivalent. The choice of checker is under the control of the test case itself, so tests that need a more fuzzy checker can provide one as needed. A clipping mechanism is included to permit exclusion of areas of the screen the test doesn't care about. For example, the desktop clock's time will vary from run to run, and thus differ from reference images so you can clip out a subregion that excludes it. Clipping also makes the reference images smaller in git. This patchset is intended to close the following bug reports as fixed: https://bugs.freedesktop.org/show_bug.cgi?id=83981 https://bugs.freedesktop.org/show_bug.cgi?id=83987 Bryce Harrington (7): configure.ac: Indicate headless compositor presence in config.h compositor: Document options for headless compositor tests: Add a fadein test tests: Add test reference directory and images for fadein tests: Add support for comparing output against reference images tests: Use only a clipped portion of screenshot for comparisons tests: Construct the filename external to wl_test_record_screenshot Derek Foreman (4): compositor-headless: allow rendering with pixman compositor-headless: add support for transforms set on command line tests: Allow tests to use customized command line parameters tests: Add screenshot recording to weston-test Makefile.am | 11 +++-- configure.ac | 3 ++ protocol/wayland-test.xml | 8 src/compositor-headless.c | 73 +++ src/compositor.c | 10 + tests/fadein-test.c | 76 tests/reference/fadein-00-0.png | Bin 0 - 737 bytes tests/reference/fadein-01-0.png | Bin 0 - 3453 bytes tests/reference/fadein-02-0.png | Bin 0 - 3499 bytes tests/reference/fadein-03-0.png | Bin 0 - 3461 bytes tests/reference/fadein-04-0.png | Bin 0 - 3461 bytes tests/reference/fadein-05-0.png | Bin 0 - 3461 bytes tests/weston-test-client-helper.c | 67 + tests/weston-test-client-helper.h | 11 + tests/weston-test-runner.c| 8 tests/weston-test.c | 88 ++ tests/weston-tests-env| 1 + 17 files changed, 344 insertions(+), 12 deletions(-) create mode 100644 tests/fadein-test.c create mode 100644 tests/reference/fadein-00-0.png create mode 100644 tests/reference/fadein-01-0.png create mode 100644 tests/reference/fadein-02-0.png create mode 100644 tests/reference/fadein-03-0.png create mode 100644 tests/reference/fadein-04-0.png create mode 100644 tests/reference/fadein-05-0.png Hi, this is a good start, and I pushed patches 1-5. I also did some changes to patch 4, I hope you don't mind. On patch 6 and onwards I suggested some improvements, so I marked them as changes requested in patchwork. Btw. I think Patchwork ignored patch 8, maybe because it was a pure binary patch. Thanks, pq ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH weston] input: don't run the key bindings on focus in
On Fri, 21 Nov 2014 13:45:04 + Daniel Stone dan...@fooishbar.org wrote: Yep, this is correct. (I'll get back to the other thread shortly.) -d On Thursday, November 20, 2014, Giulio Camuffo giuliocamu...@gmail.com wrote: When getting the focus we get the list of pressed keys, but we are not supposed to run the key binding on them. --- src/input.c | 6 -- 1 file changed, 6 deletions(-) diff --git a/src/input.c b/src/input.c index 80aa34e..15ff6ed 100644 --- a/src/input.c +++ b/src/input.c @@ -1404,12 +1404,6 @@ notify_keyboard_focus_in(struct weston_seat *seat, struct wl_array *keys, WL_KEYBOARD_KEY_STATE_PRESSED); } - /* Run key bindings after we've updated the state. */ - wl_array_for_each(k, keyboard-keys) { - weston_compositor_run_key_binding(compositor, seat, 0, *k, - WL_KEYBOARD_KEY_STATE_PRESSED); - } - surface = seat-saved_kbd_focus; if (surface) { -- Pushed! Thanks, pq ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH weston] desktop-shell: don't crash input-panel if no kbd focus
On Thu, 20 Nov 2014 10:25:17 +0200 Pekka Paalanen ppaala...@gmail.com wrote: From: Pekka Paalanen pekka.paala...@collabora.co.uk If a keyboard exists but it has no current focus, yet something asks the input-panel to come up, we would crash here. Check that there is a focus before attempting to use it. Maybe there should not even exist a case where input-panel tries to come up without a keyboard focus, but I am not sure there is no race where it could happen. In any case, this fix was brought up by the ivi-shell work, where I suppose you can somehow hit it. Signed-off-by: Pekka Paalanen pekka.paala...@collabora.co.uk Cc: Tanibata, Nobuhiko ntanib...@jp.adit-jv.com --- desktop-shell/input-panel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop-shell/input-panel.c b/desktop-shell/input-panel.c index 435cd5d..0b42c2f 100644 --- a/desktop-shell/input-panel.c +++ b/desktop-shell/input-panel.c @@ -66,7 +66,7 @@ show_input_panel_surface(struct input_panel_surface *ipsurf) float x, y; wl_list_for_each(seat, shell-compositor-seat_list, link) { - if (!seat-keyboard) + if (!seat-keyboard || !seat-keyboard-focus) continue; focus = weston_surface_get_main_surface(seat-keyboard-focus); ipsurf-output = focus-output; No objetions, so pushed. Thanks, pq ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH weston 4/6] xdg-shell: Send an error when the client uses the not-topmost popup
On Sat, 22 Nov 2014 12:28:28 -0800 Jasper St. Pierre jstpie...@mecheye.net wrote: Either in destroy or get_xdg_popup. --- desktop-shell/shell.c | 21 - protocol/xdg-shell.xml | 7 +++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index 7650884..9a69657 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -224,6 +224,7 @@ struct shell_seat { struct { struct weston_pointer_grab grab; struct weston_touch_grab touch_grab; + struct shell_surface *top_surface; So 'top_surface' is per shell_seat... You intend to support nested menus (popups), will these be an xdg_popup each? I assume they are and the (new) docs seem to say so. struct wl_list surfaces_list; struct wl_client *client; int32_t initial_up; @@ -3231,6 +3232,7 @@ popup_grab_end(struct weston_pointer *pointer) } wl_list_init(prev-popup.grab_link); wl_list_init(shseat-popup_grab.surfaces_list); + shseat-popup_grab.top_surface = NULL; ...shouldn't this restore the previous top_surface rather than NULL? That is, shouldn't top_surface act like a stack? Thanks, pq } } @@ -3291,6 +3293,8 @@ add_popup_grab(struct shell_surface *shsurf, struct shell_seat *shseat, int32_t } else { wl_list_insert(shseat-popup_grab.surfaces_list, shsurf-popup.grab_link); } + + shseat-popup_grab.top_surface = shsurf; } static void @@ -3298,6 +3302,13 @@ remove_popup_grab(struct shell_surface *shsurf) { struct shell_seat *shseat = shsurf-popup.shseat; + if (shell_surface_is_xdg_popup(shsurf) shseat-popup_grab.top_surface != shsurf) { + wl_resource_post_error(shsurf-resource, +XDG_POPUP_ERROR_NOT_THE_TOPMOST_POPUP, +xdg_popup was destroyed while it was not the topmost popup.); + return; + } + wl_list_remove(shsurf-popup.grab_link); wl_list_init(shsurf-popup.grab_link); if (wl_list_empty(shseat-popup_grab.surfaces_list)) { @@ -3945,7 +3956,15 @@ create_xdg_popup(struct shell_client *owner, void *shell, uint32_t serial, int32_t x, int32_t y) { - struct shell_surface *shsurf; + struct shell_surface *shsurf, *parent_shsurf; + + parent_shsurf = get_shell_surface(parent); + if (seat-popup_grab.top_surface != NULL seat-popup_grab.top_surface != parent_shsurf) { + wl_resource_post_error(owner-resource, +XDG_POPUP_ERROR_NOT_THE_TOPMOST_POPUP, +xdg_popup was not created on the topmost popup); + return NULL; + } shsurf = create_common_surface(owner, shell, surface, client); if (!shsurf) diff --git a/protocol/xdg-shell.xml b/protocol/xdg-shell.xml index 4414d46..360179d 100644 --- a/protocol/xdg-shell.xml +++ b/protocol/xdg-shell.xml @@ -398,6 +398,13 @@ xdg_popup surfaces are always transient for another surface. /description +enum name=error + description summary=xdg_popup error values + These errors can be emitted in response to xdg_popup requests. + /description + entry name=not_the_topmost_popup value=0 summary=The client tried to destroy a non-toplevel popup/ +/enum + request name=destroy type=destructor description summary=remove xdg_surface interface The xdg_surface interface is removed from the wl_surface object ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH v1] Added string conversion utility functions
Thanks Bill for your comments. Please see my comments inline. On Fri, Nov 21, 2014 at 9:31 PM, Bill Spitzak spit...@gmail.com wrote: There is no need to pass endptr, because your functions will always fail if it is not set to point to the terminating null. [IZ] endptr is passed other than null; please see the whole patch. why do u think it will fail? I also suspect that the base is never used. In addition a possible future fix would be to accept 0x for hex but a leading zero is decimal, not octal, which means this function would generate the base. [IZ] Base is used in weston code as well, please see the whole patch. I am also worried about passing the out ptr. Depending on the sizes of int, long, and long long this will easily result in code that compiles on one platform but not on another. Returning the value would avoid this and reduce the number of functions. Instead pass a pointer to a variable to store the error into, or use errno? Would prefer you not test the addresses of out parameters for null. It should crash at this point, as this is a programming error, not a runtime error. Returning false will make it hard to figure out what is wrong. [IZ] can u please elaborate it bit more as I can add more test cases to cover the corner case if I understand clearly what do you want to highlight? It is useful to pass -1 for strtoul and this should continue to work. It is the only easily-recognized value for largest number possible. May be ok to not allow other negative numbers however. [IZ] IMO its good to keep the APIs simple and homogeneous with appropriate data structures needed for the input BR imran On 11/21/2014 07:38 AM, Imran Zaman wrote: +static bool +convert_strtol(const char *str, char **endptr, int base, long *val) +{ + char *end = NULL; + long v; + int prev_errno = errno; + + if (!str || !val) + return false; Please do not do the above tests! + if (!endptr) + endptr = end; + + errno = 0; + v = strtol(str, endptr, base); + if (errno != 0 || *endptr == str || **endptr != '\0') + return false; + + errno = prev_errno; + *val = v; + return true; +} + +static bool +convert_strtoul (const char *str, char **endptr, int base, unsigned long *val) +{ + char *end = NULL; + unsigned long v; + int i = 0; + int prev_errno = errno; + + if (!str || !val) + return false; + /* check for negative numbers */ + while (str[i]) { + if (!isspace(str[i])) { + if (str[i] == '-') + return false; + else + break; + } + i++; + } You could do the above test afterwards and check for and allow the -1 value. + + if (!endptr) + endptr = end; + + errno = 0; + v = strtoul(str, endptr, base); + if (errno != 0 || *endptr == str || **endptr != '\0') + return false; + + errno = prev_errno; + *val = v; + return true; +} + +WL_EXPORT bool +weston_strtoi(const char *str, char **endptr, int base, int *val) +{ + long v; + + if (!convert_strtol(str, endptr, base, v) || v INT_MAX + || v INT_MIN) + return false; + + *val = (int)v; + return true; +} + +WL_EXPORT bool +weston_strtol(const char *str, char **endptr, int base, long *val) +{ + return convert_strtol(str, endptr, base, val); +} + +WL_EXPORT bool +weston_strtoui(const char *str, char **endptr, int base, unsigned int *val) +{ + unsigned long v; + + if (!convert_strtoul(str, endptr, base, v) || v UINT_MAX) + return false; + + *val = (unsigned int)v; + return true; +} + +WL_EXPORT bool +weston_strtoul(const char *str, char **endptr, int base, unsigned long *val) +{ + return convert_strtoul(str, endptr, base, val); +} ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH weston 5/6] xdg-shell: Rewrite documentation
On Sat, 22 Nov 2014 12:28:29 -0800 Jasper St. Pierre jstpie...@mecheye.net wrote: This rewrites basically all of the text inside xdg-shell to be up to date, clearer, and rid of wl_shell and X11 terminology. --- protocol/xdg-shell.xml | 256 ++--- 1 file changed, 156 insertions(+), 100 deletions(-) diff --git a/protocol/xdg-shell.xml b/protocol/xdg-shell.xml index 360179d..3359cf7 100644 --- a/protocol/xdg-shell.xml +++ b/protocol/xdg-shell.xml @@ -31,11 +31,15 @@ interface name=xdg_shell version=1 description summary=create desktop-style surfaces - This interface is implemented by servers that provide - desktop-style user interfaces. - - It allows clients to associate a xdg_surface with - a basic surface. + xdg_shell allows clients to turn a wl_surface into a real window + which can be dragged, resized, stacked, and moved around by the + user. Everything about this interface is suited towards traditional + desktop environments. + + Destroying a bound xdg_shell object while there are surfaces + still alive with roles from this interface is illegal and will + result in a protocol error. Make sure to destroy all surfaces + before destroying this object. Ok. We don't have a destroy request on xdg_shell interface currently, and you are not adding one in this series, so this cannot be enforced. Is that intentional, or should there be a destroy request? I think having a destroy request on global interfaces should be mandatory, so I'd recommend adding one. What about clients that create multiple xdg_shell objects and then further xdg_* objects from each? Do xdg_shell objects track which xdg_* objects have been created from them? /description enum name=version @@ -65,33 +69,26 @@ request name=get_xdg_surface description summary=create a shell surface from a surface - Create a shell surface for an existing surface. - - This request gives the surface the role of xdg_surface. If the - surface already has another role, it raises a protocol error. - - Only one shell or popup surface can be associated with a given - surface. + This creates an xdg_surface for the given surface and gives it the + xdg_surface role. See the documentation of xdg_surface for more details. /description arg name=id type=new_id interface=xdg_surface/ arg name=surface type=object interface=wl_surface/ /request request name=get_xdg_popup - description summary=create a shell surface from a surface - Create a popup surface for an existing surface. - - This request gives the surface the role of xdg_popup. If the - surface already has another role, it raises a protocol error. + description summary=create a popup for a surface + This creates an xdg_popup for the given surface and gives it the + xdg_popup role. See the documentation of xdg_surface for more details. ITYM xdg_popup instead of xdg_surface. - Only one shell or popup surface can be associated with a given - surface. + This request must be used in response to some sort of user action + like a button press, key press, or touch down event. /description arg name=id type=new_id interface=xdg_popup/ arg name=surface type=object interface=wl_surface/ arg name=parent type=object interface=wl_surface/ - arg name=seat type=object interface=wl_seat summary=the wl_seat whose pointer is used/ - arg name=serial type=uint summary=serial of the implicit grab on the pointer/ + arg name=seat type=object interface=wl_seat summary=the wl_seat of the user event/ + arg name=serial type=uint summary=the serial of the user event/ arg name=x type=int/ arg name=y type=int/ /request @@ -107,7 +104,7 @@ respond to the ping request, or in what timeframe. Clients should try to respond in a reasonable amount of time. /description - arg name=serial type=uint summary=pass this to the callback/ + arg name=serial type=uint summary=pass this to the pong request/ /event request name=pong @@ -120,8 +117,7 @@ /interface interface name=xdg_surface version=1 - -description summary=desktop-style metadata interface +description summary=A desktop window An interface that may be implemented by a wl_surface, for implementations that provide a desktop-style user interface. @@ -136,20 +132,22 @@ /description request name=destroy type=destructor - description summary=remove xdg_surface interface - The xdg_surface interface is removed from the wl_surface object - that was turned into a xdg_surface with - xdg_shell.get_xdg_surface request. The xdg_surface properties, - like maximized and fullscreen,
Re: Wayland and Weston in Patchwork
Hi Somehow I dont see the patch below in patch work: http://lists.freedesktop.org/archives/wayland-devel/2014-November/018410.html Any idea what is wrong with it or there is some sort of filtering or ? BR imran On Thu, Nov 20, 2014 at 12:47 AM, Bill Spitzak spit...@gmail.com wrote: On 11/19/2014 07:30 AM, Daniel Stone wrote: I don't think there's any reason to be as precious with Patchwork access as we are with others. We need all the help with triage we can get, all the changes are cosmetic and logged, and if anyone screws around with it and misrepresents mailing list consensus for any reason, then we can gently slap them around with a wet trout. Bill, I've added you as an admin now, so you should be able to change these. I took a look and that certainly looks like it will work. What I want to do is mass-change my patches to superseded. Since everybody seems to contribute large sets of patches I think everybody is interested in this. It does seem it should not be too hard of a patchwork modification to make this box work for everybody, just skipping changes on patches that don't belong to them, or popping up an error if they are not allowed. But it seems pretty safe to make everybody an administrator too. ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH weston 0/6] Fixups and rewrites for xdg-shell
On Sat, 22 Nov 2014 12:28:24 -0800 Jasper St. Pierre jstpie...@mecheye.net wrote: This is the last round of fixups I'm going to to the existing xdg-shell interface. We'll be adding on other APIs before it goes fully stable, but before that, let's focus on making sure what we already have is good enough. Jasper St. Pierre (6): xdg-shell: Take a xdg_surface as the parent surface xdg-shell: Remove the serial from popup_done xdg-shell: Remove the flags from get_xdg_popup xdg-shell: Send an error when the client uses the not-topmost popup xdg-shell: Rewrite documentation xdg-shell: Bump unstable version clients/simple-damage.c | 2 +- clients/simple-egl.c| 2 +- clients/simple-shm.c| 2 +- clients/window.c| 11 +- desktop-shell/shell.c | 28 - protocol/xdg-shell.xml | 269 +--- 6 files changed, 196 insertions(+), 118 deletions(-) Patches 1, 2, 3, and 6 are Reviewed-by: Pekka Paalanen pekka.paala...@collabora.co.uk On patch 4 I had one question. For patch 5 I had some comments, but in general very good improvements. I like the serial of the user event, for instance, and the xdg_popup general explanation is very nice. Obviously this series should land all at once to minimize the disruption, so I'll wait for my comments to be addressed and also comments from others. Thanks, pq ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: Wayland and Weston in Patchwork
On Mon, 24 Nov 2014 15:33:51 +0200 Imran Zaman imran.za...@gmail.com wrote: Hi Somehow I dont see the patch below in patch work: http://lists.freedesktop.org/archives/wayland-devel/2014-November/018410.html Any idea what is wrong with it or there is some sort of filtering or ? Hi, yeah, I tried to ask you about it in IRC. The strange things I see in that email are: Content-Type: multipart/mixed; boundary1810149695== (why multipart?) and Content-Type: text/plain; charset=y I wonder if one of those caused Patchwork to ignore it. Patchwork also seems to ignore patches that contain only binary diffs: http://lists.freedesktop.org/archives/wayland-devel/2014-November/018362.html Imran, did git-send-email ask you what charset to use for these patches, suggesting UTF-8 by default, and you perhaps replied y? That would put the y as charset there, I think. :-) Nothing else comes to mind... Thanks, pq ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH wayland] increase server listen queue to 8
Actually we were connecting multiple simultaneous child/session westons to system weston and sometime it didn't succeed. Nevertheless we are not sure that this can be one of the reasons and we couldnt spot the problem precisely (we were testing it in Tizen with kernel version: 3.14.19-10.4) We thought this can be one of the reasons if multiple clients ask for simultaneous connections. As you said its harmless, its better to increase the length anyways.. Thanks for the links. I can push the patch again after rebasing and changing queue length to 128. BR imran On Wed, Nov 19, 2014 at 12:22 PM, Pekka Paalanen ppaala...@gmail.com wrote: On Wed, 15 Oct 2014 16:43:34 +0300 Imran Zaman imran.za...@gmail.com wrote: Hi This will allow more than 1 simultaneous client connections to the server without the possibility of connection refused error. possible use case is multiple session compositors can connect to the system compositor simultaneously. diff --git a/src/wayland-server.c b/src/wayland-server.c index 674aeca..e3b7d9f 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -1126,7 +1126,7 @@ _wl_display_add_socket(struct wl_display *display, struct wl_socket *s) return -1; } - if (listen(s-fd, 1) 0) { + if (listen(s-fd, 8) 0) { wl_log(listen() failed with error: %m\n); return -1; } This patch is obviously format-broken, but the change itself seems harmless to me. Since no-one has commented on it, I suppose no-one is against it. I also found: http://utcc.utoronto.ca/~cks/space/blog/unix/ListenBacklogMeaning which suggests that the number is fairly arbitrary. I couldn't find a clear explanation what the backlog argument means for unix domain sockets, either. However, I did find a random comment: http://stackoverflow.com/questions/19221105/connect-with-unix-domain-socket-and-full-backlog That suggests that on Linux you might rather see EAGAIN than ECONNREFUSED. Sounds like it's not completely true? So, since we have no reason to artificially limit the queue, let's go with something big. Say, 128. Would you like to spin a proper patch, or shall I just rewrite this in my own name? Would be nice to hear how you actually hit the connection refused, and on what OS/kernel. Thanks, pq ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: Wayland and Weston in Patchwork
Exactly git send-email did ask for utf-8 and i guess i entered y.. shall I not? and no idea why git is making it multipart.. Shall i try to resend the patch with utf-8 question as 'no'? BR imran On Mon, Nov 24, 2014 at 3:50 PM, Pekka Paalanen ppaala...@gmail.com wrote: On Mon, 24 Nov 2014 15:33:51 +0200 Imran Zaman imran.za...@gmail.com wrote: Hi Somehow I dont see the patch below in patch work: http://lists.freedesktop.org/archives/wayland-devel/2014-November/018410.html Any idea what is wrong with it or there is some sort of filtering or ? Hi, yeah, I tried to ask you about it in IRC. The strange things I see in that email are: Content-Type: multipart/mixed; boundary1810149695== (why multipart?) and Content-Type: text/plain; charset=y I wonder if one of those caused Patchwork to ignore it. Patchwork also seems to ignore patches that contain only binary diffs: http://lists.freedesktop.org/archives/wayland-devel/2014-November/018362.html Imran, did git-send-email ask you what charset to use for these patches, suggesting UTF-8 by default, and you perhaps replied y? That would put the y as charset there, I think. :-) Nothing else comes to mind... Thanks, pq ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH weston] input: don't send to clients key events eaten by bindings
On Fri, 21 Nov 2014 18:34:32 + Daniel Stone dan...@fooishbar.org wrote: Hi, On 21 November 2014 08:57, Pekka Paalanen ppaala...@gmail.com wrote: I agree 100%. Again, think of nesting compositors: why should our compositor behave completely different if it's nested? The more difficult we make it to sensibly nest compositors, the more we're shooting ourselves in the foot. Ok, now you got me confused. Wasn't this what you said would be the correct way to handle bindings? Yeah, I'm confused too. I tried to think of a stack of: evdev - Weston - nested (compositor) - app and the different cases of how Weston behaves towards nested vs. OS (e.g. VT-switching) behaves towards Weston, and I'm not sure I see what nested would need to do differently from weston with what I thought. I tried to write out the case that made me nervous in my head, but couldn't. I'm not sure if that's because it's not actually a real problem, or I'm just far too tired. So how should it work? I would still assume, that if I press Mod+s to take a screenshot, I wouldn't want the 's' to appear on the terminal that happened to have the keyboard focus when Mod went down. If the terminal had a Mod+s shortcut too, should it run or not? That is, if all of Weston, nested, and app happened to have the same shortcut, should all three fire, or only Weston's? Only Weston. All three need to obey the same rule: - when triggering a hotkey, steal the focus and do _not_ send key events - when the grab is ended, send the focus back to the client with the true, correct, and full keyboard state in enter - on an enter event, update internal state but do _not_ trigger actions or hotkeys because of it Makes perfect sense, this and your other replies. Steal focus means sending wl_keyboard.leave to the current focus, right? Thanks, pq ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
[PATCH v2] Increase listen queue to 128
This will allow more than 1 simultaneous client connections to the server without the possibility of connection refused error. Signed-off-by: Imran Zaman imran.za...@gmail.com --- src/wayland-server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wayland-server.c b/src/wayland-server.c index c40d300..c845dd6 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -1139,7 +1139,7 @@ _wl_display_add_socket(struct wl_display *display, struct wl_socket *s) return -1; } - if (listen(s-fd, 1) 0) { + if (listen(s-fd, 128) 0) { wl_log(listen() failed with error: %m\n); return -1; } -- 1.9.1 ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH v1] Added string conversion utility functions
On 11/24/2014 05:08 AM, Imran Zaman wrote: Thanks Bill for your comments. Please see my comments inline. On Fri, Nov 21, 2014 at 9:31 PM, Bill Spitzak spit...@gmail.com wrote: There is no need to pass endptr, because your functions will always fail if it is not set to point to the terminating null. [IZ] endptr is passed other than null; please see the whole patch. why do u think it will fail? What I meant was that if this function returns success, endptr will ALWAYS be set to the string+strlen(string), ie at the NULL. As the caller can easily create this answer itself it seems useless to pass a pointer to store it. Although endptr might not point at the null when this fails, it seems hard for the caller to do anything useful with this. It would have to first determine if the error was due to something other than trailing characters, which would involve replicating the entire function locally. Therefore I think this argument is useless and there is no reason to support it. Also the grep below shows that nobody uses the endptr except to do the error checking that this function is removing the need for. I also suspect that the base is never used. In addition a possible future fix would be to accept 0x for hex but a leading zero is decimal, not octal, which means this function would generate the base. [IZ] Base is used in weston code as well, please see the whole patch. Out of 14 calls (found with git grep strto), 6 use 10, 1 uses 16, and 7 use 0. I believe all the 10s are to avoid the unexpected-octal problem. I can't be absolutely certain, but I suspect the reason this is done is to prevent unexpected octal conversion, and in fact there is no desire to make 0x prefix not work. This is a good indication that perhaps your functions should do this as well. Basically only base 10 and 0x for base 16 work. wscreensaver-glue uses 16 to read the color map out of an xpm file. I cannot find any code in weston that calls this xpm converter. I am also worried about passing the out ptr. Depending on the sizes of int, long, and long long this will easily result in code that compiles on one platform but not on another. Returning the value would avoid this and reduce the number of functions. Instead pass a pointer to a variable to store the error into, or use errno? Would prefer you not test the addresses of out parameters for null. It should crash at this point, as this is a programming error, not a runtime error. Returning false will make it hard to figure out what is wrong. [IZ] can u please elaborate it bit more as I can add more test cases to cover the corner case if I understand clearly what do you want to highlight? I want it it CRASH if null is passed for the output pointer. The easiest way to do this is to not check if it is null. Please do not return zero or do anything other than crash right at that point. This is not an environment or input error, passing null for this is a programming error that can be fixed at compile time. Hiding the error so it is not obvious the first time the program is run is completely non-productive. It is useful to pass -1 for strtoul and this should continue to work. It is the only easily-recognized value for largest number possible. May be ok to not allow other negative numbers however. Yes I don't think preserving -1 is a big deal, but I have used this in the past. The caller can certainly check for this string before calling the converter. ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH weston 5/6] xdg-shell: Rewrite documentation
On 11/22/2014 12:28 PM, Jasper St. Pierre wrote: interface name=xdg_shell version=1 + xdg_shell allows clients to turn a wl_surface into a real window + which can be dragged, resized, stacked, and moved around by the + user. Everything about this interface is suited towards traditional + desktop environments. I think this information should be moved to xdg_surface, which is much more the object the user is going to be thinking about. xdg_shell is just the factory used to create xdg_surface objects. + Destroying a bound xdg_shell object while there are surfaces + still alive with roles from this interface is illegal and will + result in a protocol error. Make sure to destroy all surfaces + before destroying this object. There does not appear to be a way to destroy a xdg_shell, actually. + description summary=set the parent of this surface + Set the parent of this surface. This window should be stacked + above a parent. The parent surface must be mapped as long as this + surface is mapped. + + Parent windows should be set on dialogs, toolboxes, or other + auxilliary surfaces, so that the parent is raised when the dialog + is raised. I think (or I hope) you mean the child will be raised when the parent is raised). You certainly should be able to raise the dialog without raising the parent, otherwise you have something identical to a subsurface. ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: FreeBSD libinput
Hey, as far as I know epoll is only available on freeBSD via the linux compatibility kernel + libraries layer, which is not installed by default. There is kqueue which is an arguably better event handling mechanism. There's an existing patch for such a rewrite here: http://lists.freedesktop.org/archives/wayland-devel/2013-February/007442.html from Philip Withnall. I'm not sure where this patch is supposed to be applied to as the files in it are not corresponding to libinput sources, but what he did could be done here with current libinput. Best method would probably be to write a basic abstraction on top of the polling mechanism and have individual mechanisms implementing it in stand-alone .c files. My biggest hurdle right now is the mtdev dependency since that library is linux specific. Thanks, Ales 2014-11-23 16:05 GMT-07:00 Peter Hutterer peter.hutte...@who-t.net: On Fri, Nov 21, 2014 at 09:10:24PM -0700, Ales Katona wrote: I wanted to try and compile libinput under freeBSD seeing how epoll has been patched into kqueue on the platform, but I'm getting stopped by configure saying it can't find EPOLL_CLOEXEC. Is this just a configure block or is the code still linux specific? how is epoll implemented in freebsd? I checked out the source, poked around a bit and even managed to find the commit (r255672) but that got reverted soon after (r255675). Best I can tell so far from the syscalls.master file is that the syscalls are just occupying space, they don't seem to do much (all the calls are simply epoll_foo(void) now). There are some references to EPOLL_CLOEXEC in the tree but svn is far to painful for me to figure out how everything fits together here, sorry. Cheers, Peter -- Feel the power of Opensource. Feel the power of Free Pascal. ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
[PATCH libinput 2/2] test: Add test for mouse dpi tag parser
Signed-off-by: Derek Foreman der...@osg.samsung.com --- test/Makefile.am| 7 - test/mouse_dpi_parser.c | 69 + 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 test/mouse_dpi_parser.c diff --git a/test/Makefile.am b/test/Makefile.am index 0abd695..1f124a3 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -41,7 +41,8 @@ run_tests = \ test-trackpoint \ test-misc \ test-keyboard \ - test-device + test-device \ + test-mouse_dpi_parser build_tests = \ test-build-cxx \ test-build-linker \ @@ -93,6 +94,10 @@ test_device_SOURCES = device.c test_device_LDADD = $(TEST_LIBS) test_device_LDFLAGS = -no-install +test_mouse_dpi_parser_SOURCES = mouse_dpi_parser.c +test_mouse_dpi_parser_LDADD = $(TEST_LIBS) +test_mouse_dpi_parser_LDFLAGS = -no-install + # build-test only test_build_pedantic_c99_SOURCES = build-pedantic.c test_build_pedantic_c99_CFLAGS = -std=c99 -pedantic -Werror diff --git a/test/mouse_dpi_parser.c b/test/mouse_dpi_parser.c new file mode 100644 index 000..bde71cb --- /dev/null +++ b/test/mouse_dpi_parser.c @@ -0,0 +1,69 @@ +/* + * Copyright © 2014 Samsung + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the copyright holders not be used in + * advertising or publicity pertaining to distribution of the software + * without specific, written prior permission. The copyright holders make + * no representations about the suitability of this software for any + * purpose. It is provided as is without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include config.h + +#include check.h +#include libinput.h +#include libinput-util.h + +#include litest.h + +struct parser_test { + char *tag; + int expected_dpi; +}; + +START_TEST(udev_dpi_parser) +{ + struct parser_test tests[] = { + { 450 *1800 3200, 1800 }, + { *450 1800 3200, 450 }, + { 450 1800 *3200, 3200 }, + { 450 1800 *failboat, 0 }, + { 0 450 1800 *3200, 0 }, + { 450@37 1800@12 *3200@6, 3200 }, + { 450@125 1800@125 *3200@125 , 3200 }, + { 450@125 *1800@125 3200@125, 1800 }, + { *this @string fails, 0 }, + { 12@34 *45@, 0 }, + { * 12, 450, 800, 0 }, + { *12, 450, 800, 12 }, + { *12, *450, 800, 12 }, + { NULL } + }; + int i, dpi; + + for (i = 0; tests[i].tag != NULL; i++) { + dpi = udev_parse_mouse_dpi_property(tests[i].tag); + ck_assert(dpi == tests[i].expected_dpi); + } +} +END_TEST + +int +main(int argc, char **argv) +{ + litest_add_no_device(udev:dpi parser, udev_dpi_parser); + + return litest_run(argc, argv); +} -- 2.1.3 ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH v1 weston 06/11] tests: Add screenshot recording to weston-test
On 24/11/14 05:01 AM, Pekka Paalanen wrote: On Wed, 19 Nov 2014 15:06:21 -0800 Bryce Harrington br...@osg.samsung.com wrote: From: Derek Foreman der...@osg.samsung.com Adds wl_test_record_screenshot() to weston test. This commit also adds a dependency on cairo to weston-test to use it for writing PNG files. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=83981 Signed-off-by: Bryce Harrington br...@osg.samsung.com Hi, could we use a wl_shm-based wl_buffer instead of a file, please? That way we can simply relay the pixels as is to the test client, which can then compare without compressing and decompressing from PNG first. Ok - it (the client) will still need to be able to write and read files though, so it can create or read the reference images. For an example how to do this, see Weston's screenshooter protocol and implementation. Thanks - I'd actually considered dumping screenshots in screenshooter's wcap format, but I figured it would be a bit of a pain to work with that. I think you also want to specify in the record_screenshot request: - which output to capture (in case there are multiple) - the rectangular sub-region that must be contained in the output (which you already do with the clip coords in a later patch, so that should be squashed here) That makes sense too. Synchronization cannot be done with wl_display_roundtrip, so you need an explicit event for that. The best would be to create a new protocol object on record_screenshot request, which then delivers the event and self-destructs, like wl_callback. You could just use wl_callback, but in principle we should avoid new use cases for wl_callback due to the design issues. Please also document carefully in which orientation the screenshot is taken and how the clip coords are interpreted, in case some output_scale/transform are in effect. Or if you rely on the renderer's read_pixels() convention, I hope that is documented somewhere... Not yet ;) (fwiw it's done so an unrotated display's screenshot looks normal in an image viewer - so the opposite of gl convention :) Btw. there is a small danger in linking Cairo to the compositor. GL-renderer uses GLESv2, but if CAIRO_LIBS contains cairo-gl.so linking to libGL, it might explode... or maybe not because of no RTLD_GLOBAL... or maybe it could, I don't know. So I'd just avoid that. :-) Sgh, I was afraid someone would come up with a reason to actually deal with libpng directly. Oh, wait, only the client has to deal with png files - I think it's safe to link cairo there? :) I see the test interface has been extended before without bumping the revision... but we probably should bump it, to not give a bad example. Hehe, that's why I thought it was ok. I'll bump it in the next revision. Thanks for the review! --- Makefile.am | 4 +-- protocol/wayland-test.xml | 3 +++ tests/weston-test.c | 68 +++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 1e7cc81..26dd473 100644 --- a/Makefile.am +++ b/Makefile.am @@ -881,7 +881,7 @@ noinst_PROGRAMS += \ matrix-test test_module_ldflags = \ --module -avoid-version -rpath $(libdir) $(COMPOSITOR_LIBS) +-module -avoid-version -rpath $(libdir) $(COMPOSITOR_LIBS) $(CAIRO_LIBS) surface_global_test_la_SOURCES = tests/surface-global-test.c surface_global_test_la_LDFLAGS = $(test_module_ldflags) @@ -893,7 +893,7 @@ surface_test_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS) weston_test_la_LIBADD = $(COMPOSITOR_LIBS) libshared.la weston_test_la_LDFLAGS = $(test_module_ldflags) -weston_test_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS) +weston_test_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS) $(CAIRO_CFLAGS) weston_test_la_SOURCES = tests/weston-test.c nodist_weston_test_la_SOURCES = \ protocol/wayland-test-protocol.c\ diff --git a/protocol/wayland-test.xml b/protocol/wayland-test.xml index 18b6625..a22a6ac 100644 --- a/protocol/wayland-test.xml +++ b/protocol/wayland-test.xml @@ -58,5 +58,8 @@ event name=n_egl_buffers arg name=n type=uint/ /event +request name=record_screenshot + arg name=basename type=string/ +/request /interface /protocol diff --git a/tests/weston-test.c b/tests/weston-test.c index f1e45c1..16f20c6 100644 --- a/tests/weston-test.c +++ b/tests/weston-test.c @@ -35,6 +35,8 @@ #include EGL/eglext.h #endif /* ENABLE_EGL */ +#include cairo.h + struct weston_test { struct weston_compositor *compositor; struct weston_layer layer; @@ -235,6 +237,71 @@ get_n_buffers(struct wl_client *client, struct wl_resource *resource) wl_test_send_n_egl_buffers(resource, n_buffers); } +static void +dump_image(const char *filename, int x, int y, uint32_t *image) +{ +cairo_surface_t
Re: [PATCH v1 weston 06/11] tests: Add screenshot recording to weston-test
On Mon, Nov 24, 2014 at 04:31:01PM -0600, Derek Foreman wrote: On 24/11/14 05:01 AM, Pekka Paalanen wrote: On Wed, 19 Nov 2014 15:06:21 -0800 Bryce Harrington br...@osg.samsung.com wrote: From: Derek Foreman der...@osg.samsung.com Adds wl_test_record_screenshot() to weston test. This commit also adds a dependency on cairo to weston-test to use it for writing PNG files. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=83981 Signed-off-by: Bryce Harrington br...@osg.samsung.com Hi, could we use a wl_shm-based wl_buffer instead of a file, please? That way we can simply relay the pixels as is to the test client, which can then compare without compressing and decompressing from PNG first. Ok - it (the client) will still need to be able to write and read files though, so it can create or read the reference images. I agree it will run faster and save on disk space if we can skip writing the images to files. Yes, we'll still need to read the reference images, but reading is faster than writing so we'll be ahead. Most of the time we don't care what the images look like anyway. That said, it can be beneficial to write the output out to files for troubleshooting purposes. So we still need a write mode. But perhaps it should be off by default with some env var or switch to make it show its work. Synchronization cannot be done with wl_display_roundtrip, so you need an explicit event for that. The best would be to create a new protocol object on record_screenshot request, which then delivers the event and self-destructs, like wl_callback. You could just use wl_callback, but in principle we should avoid new use cases for wl_callback due to the design issues. Please also document carefully in which orientation the screenshot is taken and how the clip coords are interpreted, in case some output_scale/transform are in effect. Or if you rely on the renderer's read_pixels() convention, I hope that is documented somewhere... Not yet ;) (fwiw it's done so an unrotated display's screenshot looks normal in an image viewer - so the opposite of gl convention :) Btw. there is a small danger in linking Cairo to the compositor. GL-renderer uses GLESv2, but if CAIRO_LIBS contains cairo-gl.so linking to libGL, it might explode... or maybe not because of no RTLD_GLOBAL... or maybe it could, I don't know. So I'd just avoid that. :-) Sgh, I was afraid someone would come up with a reason to actually deal with libpng directly. Oh, wait, only the client has to deal with png files - I think it's safe to link cairo there? :) Most distros don't ship cairo with gl enabled anyway. You'd have to do that intentionally. Even with it enabled, if we keep png generation client-side then we're not going to risk interfering with the compositor. Although, maybe some tests link in some compositor code and could hit the issue... not sure. At least here the scope of the problem will be limited to the one test. And there's probably a few paths to solve it. Bryce ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
[PATCH] Ignore devices that have joystick buttons
This patch allows libinput to ignore devices that have joystick buttons. Signed-off-by: Krzysztof Sobiecki sob...@gmail.com --- src/evdev.c | 9 + 1 file changed, 9 insertions(+) diff --git a/src/evdev.c b/src/evdev.c index 36c6859..5f6cc32 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1274,6 +1274,15 @@ evdev_configure_device(struct evdev_device *device) has_keyboard = 0; has_touch = 0; +for (i = BTN_JOYSTICK; i BTN_DIGI; i++) { +if (libevdev_has_event_code(evdev, EV_KEY, i)) { +log_info(libinput, + input device '%s', %s is a joystick, ignoring\n, + device-devname, device-devnode); +return -1; +} +} + if (libevdev_has_event_type(evdev, EV_ABS)) { if ((absinfo = libevdev_get_abs_info(evdev, ABS_X))) { -- 2.2.0.rc0.207.ga3a616c ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: vc_dispmanx_set_wl_buffer_in_use not found
On Tue, Nov 18, 2014 at 3:45 PM, Pekka Paalanen pekka.paala...@collabora.co.uk wrote: well, with so little information, all I can ask is: are you sure you had Wayland-enabled version of a player, and the player is using GLESv2 instead of anything else like desktop OpenGL? # ldd mplayer libGLESv2.so.2 = /opt/vc/lib/libGLESv2.so.2 (0xf67b7000) libEGL.so.1 = /opt/vc/lib/libEGL.so.1 (0xf6785000) libncurses.so.5 = /lib/libncurses.so.5 (0xf6737000) libwayland-client.so.0 = /usr/way/lib/libwayland-client.so.0 (0xf6727000) libwayland-egl.so = /opt/vc/lib/libwayland-egl.so (0xf671e000) libwayland-cursor.so.0 = /usr/way/lib/libwayland-cursor.so.0 (0xf670f000) libxkbcommon.so.0 = /usr/way/lib/libxkbcommon.so.0 (0xf66d) ... Also, does weston-simple-egl work? If that doesn't work, then nothing else EGL/Wayland will, and there is still something wrong with the EGL, driver, or Weston installation or such. weston-simple-egl works. I don't really know in what state the Mesa vc4 is in terms of running apps, but I do know that in the past, Tomeu's branch did allow weston-simple-egl to run. Not smoothly and reliably as we had some open issues, but it did run. Yes, weston-simple-egl works. I'm using Tomeu's branch. I'm not sure what you are looking for even exists, if XBMC is not suitable (I mean any of the popular rpi media apps, I don't really know those either). Still keen on getting mplayer to work. Thanks, Jeff ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH wayland 2/2] support specifying custom directories for the client and server
On 19.11.2014 12:56, Pekka Paalanen wrote: I have very hard time deciding if we should allow the environment to overwrite the server and client assumptions on where the socket is. It would be easier for me to accept new API functions that operate with absolute paths or existing fds explicitly, but those of course require both servers and clients to be written to use them. A bit tricky part in current Weston is case where you use wayland-backend. In this case Weston is client to another Weston and in addition server providing a socket to it's client. In this setup the server is sort of proxy between lower level server and the client. Since both instances solely use XDG_RUNTIME_DIR, the wayland-backend client weston is trying to connect to a socket there are create a new socket with same name in the same place... The change is intended to allow a way to tell this second weston where to look for the client socket and where to place the server socket. Usually these two are not the same place... ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH v1] Added string conversion utility functions
On Tue, Nov 25, 2014 at 1:15 AM, Bill Spitzak spit...@gmail.com wrote: On 11/24/2014 11:32 AM, Imran Zaman wrote: [IZ2] This is the case where endptr is used in patch. I can remove endptr but it seems its used so i have to keep the existing functionality in place. + if (!weston_strtoi(pid, end, 0, other) || end != pid + 10) Use strlen(pid) != 10 instead. This will not exactly replace the implemented logic e.g. pid=123abcdefg. strlen(pid) = 10 end = 3 (end != pid + 10) So cant use the solution which u propose... [IZ2] Sorry still not able to grasp what you want to highlight. Can you please give an example? If I write the following code: if (strtol(string, 0, 0, 0)) ... I want it to crash so I notice that I passed 0 for the val output pointer. There is no reason to every pass null here so it must be a programmer mistake. As you have written it this will act like there is a syntax error in string, which could lead a person trying to debug their code down the wrong path. Sorry, why is it a programmer mistake and how would it crash? Let me add the exact test code and will come back to you. It should not crash for sure IMO. Also if the pointer is passed as (structure-member) it is going to crash anyway if structure is null and the offset to member is non-zero. I would think most errors causing the pointer to be invalid will be of this form so this is not preventing any crash. This cant be prevented anyway. we are using pointers everywhere in the whole weston code base. So its the user of the function who have to pass valid pointer or NULL. I suppose null could be used as I am only testing if it parses and don't want the number but it is not implemented this way, and I kind of doubt much code is interested in that test. At least one case above is using endptr.. if we can replace it with exactly similarly logic, I can remove it otherwies I dont see any harm in its usage ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH libinput v3 2/3] touchpad: Add code to get the touchpad model / manufacturer
On Mon, Nov 24, 2014 at 12:16:05PM +0100, Hans de Goede wrote: This is useful to know in some cases, it is e.g. necessary to figure out which percentage of a touchpads range to use as edge for edge-scrolling. Note this is a slightly cleaned up copy of the same code in xf86-input-synaptics. Signed-off-by: Hans de Goede hdego...@redhat.com pushed, thanks 92d178f..6a4ceed master - master Cheers, Peter --- src/evdev-mt-touchpad.c | 36 src/evdev-mt-touchpad.h | 10 ++ 2 files changed, 46 insertions(+) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 7a1c32d..6d4b583 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -1146,6 +1146,40 @@ tp_change_to_left_handed(struct evdev_device *device) device-buttons.left_handed = device-buttons.want_left_handed; } +struct model_lookup_t { + uint16_t vendor; + uint16_t product_start; + uint16_t product_end; + enum touchpad_model model; +}; + +static struct model_lookup_t model_lookup_table[] = { + { 0x0002, 0x0007, 0x0007, MODEL_SYNAPTICS }, + { 0x0002, 0x0008, 0x0008, MODEL_ALPS }, + { 0x0002, 0x000e, 0x000e, MODEL_ELANTECH }, + { 0x05ac, 0, 0x0222, MODEL_APPLETOUCH }, + { 0x05ac, 0x0223, 0x0228, MODEL_UNIBODY_MACBOOK }, + { 0x05ac, 0x0229, 0x022b, MODEL_APPLETOUCH }, + { 0x05ac, 0x022c, 0x, MODEL_UNIBODY_MACBOOK }, + { 0, 0, 0, 0 } +}; + +static enum touchpad_model +tp_get_model(struct evdev_device *device) +{ + struct model_lookup_t *lookup; + uint16_t vendor = libevdev_get_id_vendor(device-evdev); + uint16_t product = libevdev_get_id_product(device-evdev); + + for (lookup = model_lookup_table; lookup-vendor; lookup++) { + if (lookup-vendor == vendor + lookup-product_start = product + product = lookup-product_end) + return lookup-model; + } + return MODEL_UNKNOWN; +} + struct evdev_dispatch * evdev_mt_touchpad_create(struct evdev_device *device) { @@ -1155,6 +1189,8 @@ evdev_mt_touchpad_create(struct evdev_device *device) if (!tp) return NULL; + tp-model = tp_get_model(device); + if (tp_init(tp, device) != 0) { tp_destroy(tp-base); return NULL; diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index 11c4d49..7f3ce49 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -42,6 +42,15 @@ enum touchpad_event { TOUCHPAD_EVENT_BUTTON_RELEASE = (1 2), }; +enum touchpad_model { + MODEL_UNKNOWN = 0, + MODEL_SYNAPTICS, + MODEL_ALPS, + MODEL_APPLETOUCH, + MODEL_ELANTECH, + MODEL_UNIBODY_MACBOOK +}; + enum touch_state { TOUCH_NONE = 0, TOUCH_BEGIN, @@ -156,6 +165,7 @@ struct tp_dispatch { unsigned int slot; /* current slot */ bool has_mt; bool semi_mt; + enum touchpad_model model; unsigned int real_touches; /* number of slots */ unsigned int ntouches; /* no slots inc. fakes */ -- 2.1.0 ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH 2/2] Support for adjusting socket access rights to allow group of users to connect to the socket.
On 19.11.2014 16:22, Pekka Paalanen wrote: When a session compositor is started, you can already use WAYLAND_SOCKET environment variable to pass an opened connection to it. If your system compositor forks session compositors, no problem. If something else starts your session compositors, you need a wrapper program to pre-create a connection to the socket file in the shared directory (that is not your XDG_RUNTIME_DIR) and then exec the session compositor. We are running system compositor under one special user session, in this case user genivi. This is normal session other than it is not visible to logind (pam_systemd is not called). Then, in our login manager (TLM), other seats are set to wait for the system compositor lock file to appear before logging in default (guest) user sessions. These are normal sessions visible to logind and weston for each seat runs inside the user session. When user is logged out, the weston instance is terminated and restarted for the next user session. Passing WAYLAND_SOCKET environment from a user session of user X to another newly created user sessions Y and Z is not very straightforward operation... Also lifetime of the Y and Z vary and new sessions will be spawned after one is terminated while the system compositor persists. ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH libinput 1/2] evdev: Query mouse DPI from udev
On Mon, Nov 24, 2014 at 03:53:36PM -0600, Derek Foreman wrote: Instead of using a hard coded mouse DPI value, we query it from udev. If it's not present or the property is obviously broken we fall back to default. for the archives: the thing we're struggling with on high-DPI mice is that our pointer acceleration becomes rather useless. the DPI setting is something we can't get from the device though, so our goal is to build a udev database of all devices and go from there. once that is in place, we expect the MOUSE_DPI property to be set and use that to calibrate our pointer acceleration. Signed-off-by: Derek Foreman der...@osg.samsung.com --- src/evdev.c | 18 ++ src/libinput-util.c | 41 + src/libinput-util.h | 2 ++ 3 files changed, 61 insertions(+) diff --git a/src/evdev.c b/src/evdev.c index 36c6859..a2547c7 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1218,8 +1218,11 @@ evdev_need_mtdev(struct evdev_device *device) static void evdev_tag_device(struct evdev_device *device) { + struct libinput *libinput = device-base.seat-libinput; + const char *mouse_dpi; struct udev *udev; struct udev_device *udev_device = NULL; + int dpi; udev = udev_new(); if (!udev) @@ -1229,6 +1232,21 @@ evdev_tag_device(struct evdev_device *device) if (udev_device) { if (device-dispatch-interface-tag_device) device-dispatch-interface-tag_device(device, udev_device); + mouse_dpi = udev_device_get_property_value(udev_device, MOUSE_DPI); + if (mouse_dpi) { + dpi = udev_parse_mouse_dpi_property(mouse_dpi); + if (dpi) + device-dpi = dpi; + else { + log_error(libinput, Mouse DPI property for + '%s' is present but + invalid, using %d DPI + instead\n, + device-devname, + DEFAULT_MOUSE_DPI); + device-dpi = DEFAULT_MOUSE_DPI; + } + } udev_device_unref(udev_device); } udev_unref(udev); diff --git a/src/libinput-util.c b/src/libinput-util.c index 34d5549..5600424 100644 --- a/src/libinput-util.c +++ b/src/libinput-util.c @@ -28,7 +28,9 @@ #include config.h +#include ctype.h #include stdarg.h +#include stdbool.h #include stdio.h #include stdlib.h @@ -113,3 +115,42 @@ ratelimit_test(struct ratelimit *r) return RATELIMIT_EXCEEDED; } + +int +udev_parse_mouse_dpi_property(const char *prop) I'd prefer this not be named udev_... if it's a general utility. just drop udev_ would be enough. +{ + bool is_default = false; + int rd, dpi; this is nitpicking, but I think we can afford the extra character storage to have 'nread' instead of the harder-to-interpret 'rd' :) + + /* When parsing the mouse DPI property, if we find an error we + * just return 0 since it's obviously invalid, the caller will + * treat that as an error and use a reasonable default instead. + * If the property contains multiple DPI settings but none flagged + * as default, we return the last because we're lazy and that's + * a silly way to set the property anyway. + */ it'd be nice to add a comment here on how the property _should_ look like. otherwise, looks good, thanks. I'll get the udev hwdb patches to the list asap, just a heads up: I'm going to wait until those are merged before we merge this just in case there are any last-minute changes. Cheers, Peter + while (*prop != 0) { + if (*prop == ' ') { + prop++; + continue; + } + if (*prop == '*') { + prop++; + is_default = true; + if (!isdigit(prop[0])) + return 0; + } + + rd = 0; + sscanf(prop, %d@%*d%n, dpi, rd); + if (!rd) + sscanf(prop, %d%n, dpi, rd); + if (!rd || dpi == 0 || prop[rd] == '@') + return 0; check for negative dpi/frequency here pls otherwise, looks good, thanks. Cheers, Peter + + if (is_default) + break; + prop += rd; + } + return dpi; +} diff --git a/src/libinput-util.h b/src/libinput-util.h index 909c9db..62d7ac1 100644 --- a/src/libinput-util.h +++ b/src/libinput-util.h @@ -296,4 +296,6 @@ struct ratelimit { void ratelimit_init(struct ratelimit *r, uint64_t ival_ms, unsigned int burst);
Re: [PATCH libinput 2/2] test: Add test for mouse dpi tag parser
On Mon, Nov 24, 2014 at 03:53:37PM -0600, Derek Foreman wrote: Signed-off-by: Derek Foreman der...@osg.samsung.com --- test/Makefile.am| 7 - test/mouse_dpi_parser.c | 69 + 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 test/mouse_dpi_parser.c diff --git a/test/Makefile.am b/test/Makefile.am index 0abd695..1f124a3 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -41,7 +41,8 @@ run_tests = \ test-trackpoint \ test-misc \ test-keyboard \ - test-device + test-device \ + test-mouse_dpi_parser any reason you didn't add this to misc.c? I prefer having the tests roughly grouped over a separate file for each small test. build_tests = \ test-build-cxx \ test-build-linker \ @@ -93,6 +94,10 @@ test_device_SOURCES = device.c test_device_LDADD = $(TEST_LIBS) test_device_LDFLAGS = -no-install +test_mouse_dpi_parser_SOURCES = mouse_dpi_parser.c +test_mouse_dpi_parser_LDADD = $(TEST_LIBS) +test_mouse_dpi_parser_LDFLAGS = -no-install + # build-test only test_build_pedantic_c99_SOURCES = build-pedantic.c test_build_pedantic_c99_CFLAGS = -std=c99 -pedantic -Werror diff --git a/test/mouse_dpi_parser.c b/test/mouse_dpi_parser.c new file mode 100644 index 000..bde71cb --- /dev/null +++ b/test/mouse_dpi_parser.c @@ -0,0 +1,69 @@ +/* + * Copyright © 2014 Samsung + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the copyright holders not be used in + * advertising or publicity pertaining to distribution of the software + * without specific, written prior permission. The copyright holders make + * no representations about the suitability of this software for any + * purpose. It is provided as is without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include config.h + +#include check.h +#include libinput.h +#include libinput-util.h + +#include litest.h + +struct parser_test { + char *tag; + int expected_dpi; +}; + +START_TEST(udev_dpi_parser) +{ + struct parser_test tests[] = { + { 450 *1800 3200, 1800 }, + { *450 1800 3200, 450 }, + { 450 1800 *3200, 3200 }, + { 450 1800 *failboat, 0 }, + { 0 450 1800 *3200, 0 }, + { 450@37 1800@12 *3200@6, 3200 }, + { 450@125 1800@125 *3200@125 , 3200 }, + { 450@125 *1800@125 3200@125, 1800 }, + { *this @string fails, 0 }, + { 12@34 *45@, 0 }, + { * 12, 450, 800, 0 }, + { *12, 450, 800, 12 }, + { *12, *450, 800, 12 }, pls add the empty string too, and tests for negative numbers. Cheers, Peter + { NULL } + }; + int i, dpi; + + for (i = 0; tests[i].tag != NULL; i++) { + dpi = udev_parse_mouse_dpi_property(tests[i].tag); + ck_assert(dpi == tests[i].expected_dpi); + } +} +END_TEST + +int +main(int argc, char **argv) +{ + litest_add_no_device(udev:dpi parser, udev_dpi_parser); + + return litest_run(argc, argv); +} -- 2.1.3 ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
[PATCH weston] simple-shm: explain two initial roundtrips
From: Pekka Paalanen pekka.paala...@collabora.co.uk Explain carefully why we need two roundtrips, not just one, not just dispatch and roundtrip, but two roundtrips after creating the wl_registry object. Signed-off-by: Pekka Paalanen pekka.paala...@collabora.co.uk --- clients/simple-shm.c | 30 ++ 1 file changed, 30 insertions(+) diff --git a/clients/simple-shm.c b/clients/simple-shm.c index c1cb386..996a8a9 100644 --- a/clients/simple-shm.c +++ b/clients/simple-shm.c @@ -388,6 +388,36 @@ create_display(void) wl_display_roundtrip(display-display); + /* +* Why do we need two roundtrips here? +* +* wl_display_get_registry() sends a request to the server, to which +* the server replies by emitting the wl_registry.global events. +* The first wl_display_roundtrip() sends wl_display.sync. The server +* first processes the wl_display.get_registry which includes sending +* the global events, and then processes the sync. Therefore when the +* sync (roundtrip) returns, we are guaranteed to have received and +* processed all the global events. +* +* While we are inside the first wl_display_roundtrip(), incoming +* events are dispatched, which causes registry_handle_global() to +* be called for each global. One of these globals is wl_shm. +* registry_handle_global() sends wl_registry.bind request for the +* wl_shm global. However, wl_registry.bind request is sent only after +* the first wl_display.sync, so the reply to the sync comes before +* the initial events of the wl_shm object. +* +* When the reply to the first sync comes, the server may or may not +* have sent initial wl_shm events. Therefore we need the second +* wl_display_roundtrip() call here. +* +* The server processes the wl_registry.bind for wl_shm first, and +* the second wl_display.sync next. During our second call to +* wl_display_roundtrip() the initial wl_shm events are received and +* processed. Finally, when the reply to the second wl_display.sync +* arrives, it guarantees we have processed all wl_shm initial events. +*/ + if (!(display-formats (1 WL_SHM_FORMAT_XRGB))) { fprintf(stderr, WL_SHM_FORMAT_XRGB32 not available\n); exit(1); -- 2.0.4 ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel