mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-10-29 05:40:16 -04:00
Add version information to wl_message signatures.
This commit adds version information to wl_message signatures and a wl_message_get_since function to retrieve. The since version comes in the form of a (possible) integer at the begining of the message. If the message starts with an integer, then it specifies the "since" version of that message. Messages present in version one do not get this "since" information. In this way we can run-time detect the version information for a structure on a per-message basis. Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
d94a8722cb
commit
d35b6278c0
3 changed files with 50 additions and 12 deletions
|
|
@ -402,28 +402,59 @@ wl_connection_put_fd(struct wl_connection *connection, int32_t fd)
|
|||
const char *
|
||||
get_next_argument(const char *signature, struct argument_details *details)
|
||||
{
|
||||
if (*signature == '?') {
|
||||
details->nullable = 1;
|
||||
signature++;
|
||||
} else
|
||||
details->nullable = 0;
|
||||
|
||||
details->type = *signature;
|
||||
return signature + 1;
|
||||
details->nullable = 0;
|
||||
for(; *signature; ++signature) {
|
||||
switch(*signature) {
|
||||
case 'i':
|
||||
case 'u':
|
||||
case 'f':
|
||||
case 's':
|
||||
case 'o':
|
||||
case 'n':
|
||||
case 'a':
|
||||
case 'h':
|
||||
details->type = *signature;
|
||||
return signature + 1;
|
||||
case '?':
|
||||
details->nullable = 1;
|
||||
}
|
||||
}
|
||||
return signature;
|
||||
}
|
||||
|
||||
int
|
||||
arg_count_for_signature(const char *signature)
|
||||
{
|
||||
int count = 0;
|
||||
while (*signature) {
|
||||
if (*signature != '?')
|
||||
count++;
|
||||
signature++;
|
||||
for(; *signature; ++signature) {
|
||||
switch(*signature) {
|
||||
case 'i':
|
||||
case 'u':
|
||||
case 'f':
|
||||
case 's':
|
||||
case 'o':
|
||||
case 'n':
|
||||
case 'a':
|
||||
case 'h':
|
||||
++count;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
int
|
||||
wl_message_get_since(const struct wl_message *message)
|
||||
{
|
||||
int since;
|
||||
|
||||
since = atoi(message->signature);
|
||||
|
||||
if (since == 0)
|
||||
since = 1;
|
||||
|
||||
return since;
|
||||
}
|
||||
|
||||
void
|
||||
wl_argument_from_va_list(const char *signature, union wl_argument *args,
|
||||
int count, va_list ap)
|
||||
|
|
|
|||
|
|
@ -1033,6 +1033,10 @@ emit_messages(struct wl_list *message_list,
|
|||
|
||||
wl_list_for_each(m, message_list, link) {
|
||||
printf("\t{ \"%s\", \"", m->name);
|
||||
|
||||
if (m->since > 1)
|
||||
printf("%d", m->since);
|
||||
|
||||
wl_list_for_each(a, &m->arg_list, link) {
|
||||
if (is_nullable_type(a) && a->nullable)
|
||||
printf("?");
|
||||
|
|
|
|||
|
|
@ -130,6 +130,9 @@ get_next_argument(const char *signature, struct argument_details *details);
|
|||
int
|
||||
arg_count_for_signature(const char *signature);
|
||||
|
||||
int
|
||||
wl_message_get_since(const struct wl_message *message);
|
||||
|
||||
void
|
||||
wl_argument_from_va_list(const char *signature, union wl_argument *args,
|
||||
int count, va_list ap);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue