Re: [PATCH Weston 1/1] desktop-shell: implement autolaunch
The %m from glibc would indeed be a portability problem. However, it is already lightly used within wayland (11 occurrences) and heavily in weston (125 occurrences). I suggest you keep them for now, then clean them all up in one patch later - assuming the wayland community and prospective users consider portability a worthwhile effort. Cheers, Karsten Am 22.10.2014 um 17:57 schrieb Derek Foreman : > I'd prefer to see the refactor and the new feature in separate patches, > but this is pretty trivial. > > I also have a slight preference for exit(EXIT_FAILURE), which is already > used somewhere else in that file - though there's also precedent for > exit(1), so you make the call. :) > > I'd not seen printf's %m until today - do we want to depend on a gnuism? > I've seen at least some activity towards a freebsd port - I don't > believe %m is supported there? > > > That said, it runs nicely here and does what it says on the tin... > > Reviewed-by: Derek Foreman > > On 22/10/14 08:53 AM, Pekka Paalanen wrote: >> Process a new section 'autolaunch' from weston.ini, launching all >> programs given there on desktop start-up. >> >> [Frederic Plourde: cut redundancy between do_autolaunch and >> panel_add_launcher] >> --- >> clients/desktop-shell.c | 97 >> ++--- >> man/weston.ini.man | 17 + >> weston.ini.in | 3 ++ >> 3 files changed, 103 insertions(+), 14 deletions(-) >> >> diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c >> index 961a9b2..a964094 100644 >> --- a/clients/desktop-shell.c >> +++ b/clients/desktop-shell.c >> @@ -597,72 +597,82 @@ load_icon_or_fallback(const char *icon) >> cairo_move_to(cr, 4, 16); >> cairo_line_to(cr, 16, 4); >> cairo_stroke(cr); >> >> cairo_destroy(cr); >> >> return surface; >> } >> >> static void >> -panel_add_launcher(struct panel *panel, const char *icon, const char *path) >> +parse_launcher_path(char *path, struct wl_array *envp_array, struct >> wl_array *argv_array) >> { >> -struct panel_launcher *launcher; >> char *start, *p, *eq, **ps; >> int i, j, k; >> >> -launcher = xzalloc(sizeof *launcher); >> -launcher->icon = load_icon_or_fallback(icon); >> -launcher->path = xstrdup(path); >> +struct wl_array *envp = envp_array; >> +struct wl_array *argv = argv_array; >> >> -wl_array_init(&launcher->envp); >> -wl_array_init(&launcher->argv); >> +wl_array_init(envp); >> +wl_array_init(argv); >> for (i = 0; environ[i]; i++) { >> -ps = wl_array_add(&launcher->envp, sizeof *ps); >> +ps = wl_array_add(envp, sizeof *ps); >> *ps = environ[i]; >> } >> j = 0; >> >> -start = launcher->path; >> +start = path; >> while (*start) { >> for (p = start, eq = NULL; *p && !isspace(*p); p++) >> if (*p == '=') >> eq = p; >> >> if (eq && j == 0) { >> -ps = launcher->envp.data; >> +ps = envp->data; >> for (k = 0; k < i; k++) >> if (strncmp(ps[k], start, eq - start) == 0) { >> ps[k] = start; >> break; >> } >> if (k == i) { >> -ps = wl_array_add(&launcher->envp, sizeof *ps); >> +ps = wl_array_add(envp, sizeof *ps); >> *ps = start; >> i++; >> } >> } else { >> -ps = wl_array_add(&launcher->argv, sizeof *ps); >> +ps = wl_array_add(argv, sizeof *ps); >> *ps = start; >> j++; >> } >> >> while (*p && isspace(*p)) >> *p++ = '\0'; >> >> start = p; >> } >> >> -ps = wl_array_add(&launcher->envp, sizeof *ps); >> +ps = wl_array_add(envp, sizeof *ps); >> *ps = NULL; >> -ps = wl_array_add(&launcher->argv, sizeof *ps); >> +ps = wl_array_add(argv, sizeof *ps); >> *ps = NULL; >> +} >> + >> +static void >> +panel_add_launcher(struct panel *panel, const char *icon, const char *path) >> +{ >> +struct panel_launcher *launcher; >> + >> +launcher = xzalloc(sizeof *launcher); >> +launcher->icon = load_icon_or_fallback(icon); >> +launcher->path = xstrdup(path); >> + >> +parse_launcher_path(launcher->path, &launcher->envp, &launcher->argv); >> >> launcher->panel = panel; >> wl_list_insert(panel->launcher_list.prev, &launcher->link); >> >> launcher->widget = widget_add_widget(panel->widget, launcher); >> widget_set_enter_handler(launcher->widget, >> panel_launcher_enter_handler); >> widget_set_leave_handler(launcher->wid
Re: [PATCH v2] wayland-util: added wl_strtol/wl_strtoul utility functions
On 10/22/2014 02:13 AM, Marek Chalupa wrote: What I'm wondering is what should be the behavior of wl_strtoul for negative numbers? strtoul silently converts them, but I don't think this is what we always want... or is it? -1 is a handy shortcut for strtoul to get all the bits turned on and get the maximum possible value. Not sure if other negative numbers are much use though. ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
[PATCH] gitignore: adpat to scanner and protocol path changes
Since commit 4c163b9b001bd93aaf97d7e962873a379eb90bfd, wayland-scanner is built in top builddir instead of src, and protocol files are generated in protocol subdir instead of src. Protocol files generated in the new path are already properly ignored in the toplevel gitignore file. Signed-off-by: Olivier Blin --- .gitignore | 2 +- src/.gitignore | 4 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index d9d26ed..4e0f5d9 100644 --- a/.gitignore +++ b/.gitignore @@ -54,5 +54,5 @@ resources-test sanity-test signal-test socket-test -wayland-scanner +/wayland-scanner protocol/*.[ch] diff --git a/src/.gitignore b/src/.gitignore index 1438b74..4421b46 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1,5 +1 @@ -wayland-scanner -wayland-client-protocol.h -wayland-protocol.c -wayland-server-protocol.h /wayland-version.h -- 2.1.2 -- This message and any attachments herein are confidential, intended solely for the addressees and are SoftAtHome.s ownership. Any unauthorized use or dissemination is prohibited. If you are not the intended addressee of this message, please cancel it immediately and inform the sender. -- This message and any attachments herein are confidential, intended solely for the addressees and are SoftAtHome.s ownership. Any unauthorized use or dissemination is prohibited. If you are not the intended addressee of this message, please cancel it immediately and inform the sender. ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH Weston 1/1] desktop-shell: implement autolaunch
I'd prefer to see the refactor and the new feature in separate patches, but this is pretty trivial. I also have a slight preference for exit(EXIT_FAILURE), which is already used somewhere else in that file - though there's also precedent for exit(1), so you make the call. :) I'd not seen printf's %m until today - do we want to depend on a gnuism? I've seen at least some activity towards a freebsd port - I don't believe %m is supported there? That said, it runs nicely here and does what it says on the tin... Reviewed-by: Derek Foreman On 22/10/14 08:53 AM, Pekka Paalanen wrote: > Process a new section 'autolaunch' from weston.ini, launching all > programs given there on desktop start-up. > > [Frederic Plourde: cut redundancy between do_autolaunch and > panel_add_launcher] > --- > clients/desktop-shell.c | 97 > ++--- > man/weston.ini.man | 17 + > weston.ini.in | 3 ++ > 3 files changed, 103 insertions(+), 14 deletions(-) > > diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c > index 961a9b2..a964094 100644 > --- a/clients/desktop-shell.c > +++ b/clients/desktop-shell.c > @@ -597,72 +597,82 @@ load_icon_or_fallback(const char *icon) > cairo_move_to(cr, 4, 16); > cairo_line_to(cr, 16, 4); > cairo_stroke(cr); > > cairo_destroy(cr); > > return surface; > } > > static void > -panel_add_launcher(struct panel *panel, const char *icon, const char *path) > +parse_launcher_path(char *path, struct wl_array *envp_array, struct wl_array > *argv_array) > { > - struct panel_launcher *launcher; > char *start, *p, *eq, **ps; > int i, j, k; > > - launcher = xzalloc(sizeof *launcher); > - launcher->icon = load_icon_or_fallback(icon); > - launcher->path = xstrdup(path); > + struct wl_array *envp = envp_array; > + struct wl_array *argv = argv_array; > > - wl_array_init(&launcher->envp); > - wl_array_init(&launcher->argv); > + wl_array_init(envp); > + wl_array_init(argv); > for (i = 0; environ[i]; i++) { > - ps = wl_array_add(&launcher->envp, sizeof *ps); > + ps = wl_array_add(envp, sizeof *ps); > *ps = environ[i]; > } > j = 0; > > - start = launcher->path; > + start = path; > while (*start) { > for (p = start, eq = NULL; *p && !isspace(*p); p++) > if (*p == '=') > eq = p; > > if (eq && j == 0) { > - ps = launcher->envp.data; > + ps = envp->data; > for (k = 0; k < i; k++) > if (strncmp(ps[k], start, eq - start) == 0) { > ps[k] = start; > break; > } > if (k == i) { > - ps = wl_array_add(&launcher->envp, sizeof *ps); > + ps = wl_array_add(envp, sizeof *ps); > *ps = start; > i++; > } > } else { > - ps = wl_array_add(&launcher->argv, sizeof *ps); > + ps = wl_array_add(argv, sizeof *ps); > *ps = start; > j++; > } > > while (*p && isspace(*p)) > *p++ = '\0'; > > start = p; > } > > - ps = wl_array_add(&launcher->envp, sizeof *ps); > + ps = wl_array_add(envp, sizeof *ps); > *ps = NULL; > - ps = wl_array_add(&launcher->argv, sizeof *ps); > + ps = wl_array_add(argv, sizeof *ps); > *ps = NULL; > +} > + > +static void > +panel_add_launcher(struct panel *panel, const char *icon, const char *path) > +{ > + struct panel_launcher *launcher; > + > + launcher = xzalloc(sizeof *launcher); > + launcher->icon = load_icon_or_fallback(icon); > + launcher->path = xstrdup(path); > + > + parse_launcher_path(launcher->path, &launcher->envp, &launcher->argv); > > launcher->panel = panel; > wl_list_insert(panel->launcher_list.prev, &launcher->link); > > launcher->widget = widget_add_widget(panel->widget, launcher); > widget_set_enter_handler(launcher->widget, >panel_launcher_enter_handler); > widget_set_leave_handler(launcher->widget, > panel_launcher_leave_handler); > widget_set_button_handler(launcher->widget, > @@ -1316,20 +1326,77 @@ panel_add_launchers(struct panel *panel, struct > desktop *desktop) > } > > if (count == 0) { > /* add default launcher */ > panel_add_launcher(panel, > DATADIR "/weston/terminal.png", > BINDIR "/weston-ter
[PATCH Weston 1/1] desktop-shell: implement autolaunch
Process a new section 'autolaunch' from weston.ini, launching all programs given there on desktop start-up. [Frederic Plourde: cut redundancy between do_autolaunch and panel_add_launcher] --- clients/desktop-shell.c | 97 ++--- man/weston.ini.man | 17 + weston.ini.in | 3 ++ 3 files changed, 103 insertions(+), 14 deletions(-) diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index 961a9b2..a964094 100644 --- a/clients/desktop-shell.c +++ b/clients/desktop-shell.c @@ -597,72 +597,82 @@ load_icon_or_fallback(const char *icon) cairo_move_to(cr, 4, 16); cairo_line_to(cr, 16, 4); cairo_stroke(cr); cairo_destroy(cr); return surface; } static void -panel_add_launcher(struct panel *panel, const char *icon, const char *path) +parse_launcher_path(char *path, struct wl_array *envp_array, struct wl_array *argv_array) { - struct panel_launcher *launcher; char *start, *p, *eq, **ps; int i, j, k; - launcher = xzalloc(sizeof *launcher); - launcher->icon = load_icon_or_fallback(icon); - launcher->path = xstrdup(path); + struct wl_array *envp = envp_array; + struct wl_array *argv = argv_array; - wl_array_init(&launcher->envp); - wl_array_init(&launcher->argv); + wl_array_init(envp); + wl_array_init(argv); for (i = 0; environ[i]; i++) { - ps = wl_array_add(&launcher->envp, sizeof *ps); + ps = wl_array_add(envp, sizeof *ps); *ps = environ[i]; } j = 0; - start = launcher->path; + start = path; while (*start) { for (p = start, eq = NULL; *p && !isspace(*p); p++) if (*p == '=') eq = p; if (eq && j == 0) { - ps = launcher->envp.data; + ps = envp->data; for (k = 0; k < i; k++) if (strncmp(ps[k], start, eq - start) == 0) { ps[k] = start; break; } if (k == i) { - ps = wl_array_add(&launcher->envp, sizeof *ps); + ps = wl_array_add(envp, sizeof *ps); *ps = start; i++; } } else { - ps = wl_array_add(&launcher->argv, sizeof *ps); + ps = wl_array_add(argv, sizeof *ps); *ps = start; j++; } while (*p && isspace(*p)) *p++ = '\0'; start = p; } - ps = wl_array_add(&launcher->envp, sizeof *ps); + ps = wl_array_add(envp, sizeof *ps); *ps = NULL; - ps = wl_array_add(&launcher->argv, sizeof *ps); + ps = wl_array_add(argv, sizeof *ps); *ps = NULL; +} + +static void +panel_add_launcher(struct panel *panel, const char *icon, const char *path) +{ + struct panel_launcher *launcher; + + launcher = xzalloc(sizeof *launcher); + launcher->icon = load_icon_or_fallback(icon); + launcher->path = xstrdup(path); + + parse_launcher_path(launcher->path, &launcher->envp, &launcher->argv); launcher->panel = panel; wl_list_insert(panel->launcher_list.prev, &launcher->link); launcher->widget = widget_add_widget(panel->widget, launcher); widget_set_enter_handler(launcher->widget, panel_launcher_enter_handler); widget_set_leave_handler(launcher->widget, panel_launcher_leave_handler); widget_set_button_handler(launcher->widget, @@ -1316,20 +1326,77 @@ panel_add_launchers(struct panel *panel, struct desktop *desktop) } if (count == 0) { /* add default launcher */ panel_add_launcher(panel, DATADIR "/weston/terminal.png", BINDIR "/weston-terminal"); } } +static void +do_autolaunch(const char *path_arg) +{ + struct wl_array envp; + struct wl_array argv; + pid_t pid; + char **argvpp; + char *path; + + path = xstrdup(path_arg); + + parse_launcher_path(path, &envp, &argv); + + /* panel_launcher_activate */ + + pid = fork(); + if (pid < 0) { + fprintf(stderr, "fork failed: %m\n"); + goto out; + } + + if (pid) + goto out; + + argvpp = argv.data; + if (execve(argvpp[0], argvpp, envp.data) < 0) { + fprintf(stderr, "execl '%s' failed: %m\n", argvpp[0]); + exit
Re: [PATCH v2] wayland-util: added wl_strtol/wl_strtoul utility functions
I pushed an updated patch v3. Added test cases for overflow and also check for negative numbers for wl_strtoul.. please review BR imran On Wed, Oct 22, 2014 at 12:13 PM, Marek Chalupa wrote: > Hi, > > Personally, I'd rather see these functions private (somebody has already > mentioned that), > but I understand there are reasons for them to be public and maybe in the > end it will have more pros.. > Anyway, I have few nitpicks and a questions - see below. > > On 16 October 2014 18:11, Imran Zaman wrote: >> >> strtol/strtoul utility functions are used extensively in >> weston/wayland, and are not bug-free in their current form. >> To avoid definition in weston and wayland, its wrapped >> in functions with appropriate input and output checks. >> Test cases are also updated. >> >> Signed-off-by: Imran Zaman >> --- >> src/scanner.c| 5 +-- >> src/wayland-client.c | 5 +-- >> src/wayland-util.c | 38 >> src/wayland-util.h | 4 ++ >> tests/fixed-test.c | 122 >> +++ >> 5 files changed, 167 insertions(+), 7 deletions(-) >> >> diff --git a/src/scanner.c b/src/scanner.c >> index 809130b..165b12b 100644 >> --- a/src/scanner.c >> +++ b/src/scanner.c >> @@ -315,7 +315,6 @@ start_element(void *data, const char *element_name, >> const char **atts) >> struct description *description; >> const char *name, *type, *interface_name, *value, *summary, >> *since; >> const char *allow_null; >> - char *end; >> int i, version; >> >> ctx->loc.line_number = XML_GetCurrentLineNumber(ctx->parser); >> @@ -404,9 +403,7 @@ start_element(void *data, const char *element_name, >> const char **atts) >> message->destructor = 0; >> >> if (since != NULL) { >> - errno = 0; >> - version = strtol(since, &end, 0); >> - if (errno == EINVAL || end == since || *end != >> '\0') >> + if (!wl_strtol(since, NULL, 0, (long *)&version)) >> fail(&ctx->loc, >> "invalid integer (%s)\n", since); >> } else { >> diff --git a/src/wayland-client.c b/src/wayland-client.c >> index b0f77b9..fd98705 100644 >> --- a/src/wayland-client.c >> +++ b/src/wayland-client.c >> @@ -824,13 +824,12 @@ wl_display_connect_to_fd(int fd) >> WL_EXPORT struct wl_display * >> wl_display_connect(const char *name) >> { >> - char *connection, *end; >> + char *connection; >> int flags, fd; >> >> connection = getenv("WAYLAND_SOCKET"); >> if (connection) { >> - fd = strtol(connection, &end, 0); >> - if (*end != '\0') >> + if (!wl_strtol(connection, NULL, 0, (long *)&fd)) >> return NULL; >> >> flags = fcntl(fd, F_GETFD); >> diff --git a/src/wayland-util.c b/src/wayland-util.c >> index b099882..dfd2eb1 100644 >> --- a/src/wayland-util.c >> +++ b/src/wayland-util.c >> @@ -26,6 +26,8 @@ >> #include >> #include >> #include >> +#include >> +#include >> >> #include "wayland-util.h" >> #include "wayland-private.h" >> @@ -361,6 +363,42 @@ wl_map_for_each(struct wl_map *map, >> wl_iterator_func_t func, void *data) >> for_each_helper(&map->server_entries, func, data); >> } >> >> +WL_EXPORT bool >> +wl_strtol(const char *str, char **endptr, int base, long *val) >> +{ >> + char *end = NULL; >> + long v; >> + >> + if (!str || !val) return false; >> + if (!endptr) endptr = &end; > > > The 'return false' and 'endptr =&end' should be on new line > http://cgit.freedesktop.org/wayland/wayland/tree/doc/Contributing#n33 > >> >> + >> + errno = 0; >> + v = strtol(str, endptr, base); >> + if (errno != 0 || *endptr == str || **endptr != '\0') >> + return false; >> + >> + *val = v; >> + return true; >> +} >> + >> +WL_EXPORT bool >> +wl_strtoul(const char *str, char **endptr, int base, unsigned long *val) >> +{ >> + char *end = NULL; >> + unsigned long v; >> + >> + if (!str || !val) return false; >> + if (!endptr) endptr = &end; > > > The same > >> >> + >> + errno = 0; >> + v = strtoul(str, endptr, base); >> + if (errno != 0 || *endptr == str || **endptr != '\0') >> + return false; >> + >> + *val = v; >> + return true; >> +} >> + >> static void >> wl_log_stderr_handler(const char *fmt, va_list arg) >> { >> diff --git a/src/wayland-util.h b/src/wayland-util.h >> index fd32826..c66cc41 100644 >> --- a/src/wayland-util.h >> +++ b/src/wayland-util.h >> @@ -36,6 +36,7 @@ extern "C" { >> #include >> #include >> #include >> +#include >> >> /* GCC visibility */ >> #if defined(__GNUC__) && __GNUC__ >= 4 >> @@ -243,6 +244,9 @@ static inline wl_fixed_t wl_fixed_from_int(int i) >> return i * 256; >
[PATCH v3] wayland-util: added wl_strtol/wl_strtoul utility functions
strtol/strtoul utility functions are used extensively in weston/wayland, and are not bug-free in their current form. To avoid definition in weston and wayland, its wrapped in functions with appropriate input and output checks. Test cases are also updated. Signed-off-by: Imran Zaman --- src/scanner.c| 5 +- src/wayland-client.c | 5 +- src/wayland-util.c | 55 src/wayland-util.h | 4 ++ tests/fixed-test.c | 142 +++ 5 files changed, 204 insertions(+), 7 deletions(-) diff --git a/src/scanner.c b/src/scanner.c index 809130b..165b12b 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -315,7 +315,6 @@ start_element(void *data, const char *element_name, const char **atts) struct description *description; const char *name, *type, *interface_name, *value, *summary, *since; const char *allow_null; - char *end; int i, version; ctx->loc.line_number = XML_GetCurrentLineNumber(ctx->parser); @@ -404,9 +403,7 @@ start_element(void *data, const char *element_name, const char **atts) message->destructor = 0; if (since != NULL) { - errno = 0; - version = strtol(since, &end, 0); - if (errno == EINVAL || end == since || *end != '\0') + if (!wl_strtol(since, NULL, 0, (long *)&version)) fail(&ctx->loc, "invalid integer (%s)\n", since); } else { diff --git a/src/wayland-client.c b/src/wayland-client.c index b0f77b9..fd98705 100644 --- a/src/wayland-client.c +++ b/src/wayland-client.c @@ -824,13 +824,12 @@ wl_display_connect_to_fd(int fd) WL_EXPORT struct wl_display * wl_display_connect(const char *name) { - char *connection, *end; + char *connection; int flags, fd; connection = getenv("WAYLAND_SOCKET"); if (connection) { - fd = strtol(connection, &end, 0); - if (*end != '\0') + if (!wl_strtol(connection, NULL, 0, (long *)&fd)) return NULL; flags = fcntl(fd, F_GETFD); diff --git a/src/wayland-util.c b/src/wayland-util.c index b099882..a930364 100644 --- a/src/wayland-util.c +++ b/src/wayland-util.c @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include "wayland-util.h" #include "wayland-private.h" @@ -361,6 +363,59 @@ wl_map_for_each(struct wl_map *map, wl_iterator_func_t func, void *data) for_each_helper(&map->server_entries, func, data); } +WL_EXPORT bool +wl_strtol(const char *str, char **endptr, int base, long *val) +{ + char *end = NULL; + long v; + + if (!str || !val) + return false; + if (!endptr) + endptr = &end; + + errno = 0; + v = strtol(str, endptr, base); + if (errno != 0 || *endptr == str || **endptr != '\0') + return false; + + *val = v; + return true; +} + +WL_EXPORT bool +wl_strtoul(const char *str, char **endptr, int base, unsigned long *val) +{ + char *end = NULL; + unsigned long v; + int i = 0; + + if (!str || !val) + return false; + + /* check for negative numbers */ + while (str[i]) { + if (!isspace(str[i])) { + if (str[i] == '-') + return false; + else + break; + } + i++; + } + + if (!endptr) + endptr = &end; + + errno = 0; + v = strtoul(str, endptr, base); + if (errno != 0 || *endptr == str || **endptr != '\0') + return false; + + *val = v; + return true; +} + static void wl_log_stderr_handler(const char *fmt, va_list arg) { diff --git a/src/wayland-util.h b/src/wayland-util.h index fd32826..c66cc41 100644 --- a/src/wayland-util.h +++ b/src/wayland-util.h @@ -36,6 +36,7 @@ extern "C" { #include #include #include +#include /* GCC visibility */ #if defined(__GNUC__) && __GNUC__ >= 4 @@ -243,6 +244,9 @@ static inline wl_fixed_t wl_fixed_from_int(int i) return i * 256; } +bool wl_strtol(const char *str, char **endptr, int base, long *val); +bool wl_strtoul(const char *str, char **endptr, int base, unsigned long *val); + /** * \brief A union representing all of the basic data types that can be passed * along the wayland wire format. diff --git a/tests/fixed-test.c b/tests/fixed-test.c index 739a3b1..ad40467 100644 --- a/tests/fixed-test.c +++ b/tests/fixed-test.c @@ -88,3 +88,145 @@ TEST(fixed_int_conversions) i = wl_fixed_to_int(f); assert(i == -0x50); } + +TEST(strtol_conversions) +{ + bool ret; + long val = -1; + char *end = NULL, *str = NULL; + + ret = wl_strtol(NULL
Re: libinput: Support for long press key detection?
On Tue, Oct 21, 2014 at 08:21:26PM +0200, Stefanie Behme wrote: > Hi, > > on last ELCE in Duesseldorf I learned that the development of libinput was > started to handle input devices in Wayland compositors. I had a look in the > API documentation and found that the enum "libinput_key_state" has these > values: LIBINPUT_KEY_STATE_RELEASED and LIBINPUT_KEY_STATE_PRESSED. > > There is a need to detect if a key is pressed (and hold) for a certain > amount of time. If this is the case a long-press key event is send. It is > also possible that several long-press key events are defined for one key, > e.g.: > - 500 ms: KEY_STATE_LONG_PRESSED_1 > - 1000 ms: KEY_STATE_LONG_PRESSED_2 > - 5000 ms: KEY_STATE_LONG_PRESSED_3 > > A long press on a key is e.g. used to create a screen shot. > > Is there any plan to support this kind of long press detection? How could > this look like? Any ideas? this would be too high-level for libinput. If you need that functionality, best is to handle it with a timer in the compositor where you also have more semantic information than in libinput. Cheers, Peter ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH v2] wayland-util: added wl_strtol/wl_strtoul utility functions
Hi, Personally, I'd rather see these functions private (somebody has already mentioned that), but I understand there are reasons for them to be public and maybe in the end it will have more pros.. Anyway, I have few nitpicks and a questions - see below. On 16 October 2014 18:11, Imran Zaman wrote: > strtol/strtoul utility functions are used extensively in > weston/wayland, and are not bug-free in their current form. > To avoid definition in weston and wayland, its wrapped > in functions with appropriate input and output checks. > Test cases are also updated. > > Signed-off-by: Imran Zaman > --- > src/scanner.c| 5 +-- > src/wayland-client.c | 5 +-- > src/wayland-util.c | 38 > src/wayland-util.h | 4 ++ > tests/fixed-test.c | 122 > +++ > 5 files changed, 167 insertions(+), 7 deletions(-) > > diff --git a/src/scanner.c b/src/scanner.c > index 809130b..165b12b 100644 > --- a/src/scanner.c > +++ b/src/scanner.c > @@ -315,7 +315,6 @@ start_element(void *data, const char *element_name, > const char **atts) > struct description *description; > const char *name, *type, *interface_name, *value, *summary, *since; > const char *allow_null; > - char *end; > int i, version; > > ctx->loc.line_number = XML_GetCurrentLineNumber(ctx->parser); > @@ -404,9 +403,7 @@ start_element(void *data, const char *element_name, > const char **atts) > message->destructor = 0; > > if (since != NULL) { > - errno = 0; > - version = strtol(since, &end, 0); > - if (errno == EINVAL || end == since || *end != > '\0') > + if (!wl_strtol(since, NULL, 0, (long *)&version)) > fail(&ctx->loc, > "invalid integer (%s)\n", since); > } else { > diff --git a/src/wayland-client.c b/src/wayland-client.c > index b0f77b9..fd98705 100644 > --- a/src/wayland-client.c > +++ b/src/wayland-client.c > @@ -824,13 +824,12 @@ wl_display_connect_to_fd(int fd) > WL_EXPORT struct wl_display * > wl_display_connect(const char *name) > { > - char *connection, *end; > + char *connection; > int flags, fd; > > connection = getenv("WAYLAND_SOCKET"); > if (connection) { > - fd = strtol(connection, &end, 0); > - if (*end != '\0') > + if (!wl_strtol(connection, NULL, 0, (long *)&fd)) > return NULL; > > flags = fcntl(fd, F_GETFD); > diff --git a/src/wayland-util.c b/src/wayland-util.c > index b099882..dfd2eb1 100644 > --- a/src/wayland-util.c > +++ b/src/wayland-util.c > @@ -26,6 +26,8 @@ > #include > #include > #include > +#include > +#include > > #include "wayland-util.h" > #include "wayland-private.h" > @@ -361,6 +363,42 @@ wl_map_for_each(struct wl_map *map, > wl_iterator_func_t func, void *data) > for_each_helper(&map->server_entries, func, data); > } > > +WL_EXPORT bool > +wl_strtol(const char *str, char **endptr, int base, long *val) > +{ > + char *end = NULL; > + long v; > + > + if (!str || !val) return false; > + if (!endptr) endptr = &end; > The 'return false' and 'endptr =&end' should be on new line http://cgit.freedesktop.org/wayland/wayland/tree/doc/Contributing#n33 > + > + errno = 0; > + v = strtol(str, endptr, base); > + if (errno != 0 || *endptr == str || **endptr != '\0') > + return false; > + > + *val = v; > + return true; > +} > + > +WL_EXPORT bool > +wl_strtoul(const char *str, char **endptr, int base, unsigned long *val) > +{ > + char *end = NULL; > + unsigned long v; > + > + if (!str || !val) return false; > + if (!endptr) endptr = &end; > The same > + > + errno = 0; > + v = strtoul(str, endptr, base); > + if (errno != 0 || *endptr == str || **endptr != '\0') > + return false; > + > + *val = v; > + return true; > +} > + > static void > wl_log_stderr_handler(const char *fmt, va_list arg) > { > diff --git a/src/wayland-util.h b/src/wayland-util.h > index fd32826..c66cc41 100644 > --- a/src/wayland-util.h > +++ b/src/wayland-util.h > @@ -36,6 +36,7 @@ extern "C" { > #include > #include > #include > +#include > > /* GCC visibility */ > #if defined(__GNUC__) && __GNUC__ >= 4 > @@ -243,6 +244,9 @@ static inline wl_fixed_t wl_fixed_from_int(int i) > return i * 256; > } > > +bool wl_strtol(const char *str, char **endptr, int base, long *val); > +bool wl_strtoul(const char *str, char **endptr, int base, unsigned long > *val); > + > /** > * \brief A union representing all of the basic data types that can be > passed > * along the wayland wire format. > diff --git a/tests/fixed-test.c b/tests/fixed-test.c > index 739a3b
Re: [PATCH 2/2] Support for adjusting socket access rights to allow group of users to connect to the socket.
On 20.10.2014 18:13, Daniel Stone wrote: Each to their own; I don't think it's necessarily any more complex than split compositors, since at some point you have to deal with input splitting anyway, and if you want both security (i.e. random users not opening random devices) and performance (i.e. no unnecessary hops through input compositor for events), you end up having to deal with input splitting in your system compositor anyway. Access control is no different whether you have 1 weston or 3 westons running. It is about amount of changes needed, fairly small patch vs almost complete weston rewrite... ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel