diff options
-rw-r--r-- | protocol/wayland.xml | 256 | ||||
-rw-r--r-- | src/connection.c | 6 | ||||
-rw-r--r-- | src/wayland-client.c | 3 | ||||
-rw-r--r-- | src/wayland-server.c | 13 | ||||
-rw-r--r-- | src/wayland-server.h | 47 |
5 files changed, 132 insertions, 193 deletions
diff --git a/protocol/wayland.xml b/protocol/wayland.xml index 7e6392a..51a83ef 100644 --- a/protocol/wayland.xml +++ b/protocol/wayland.xml @@ -157,6 +157,115 @@ <event name="release"/> </interface> + + <interface name="wl_data_offer" version="1"> + <!-- Indicate that the client can accept the given mime-type, or + NULL for not accepted. Use for feedback during drag and + drop. --> + <request name="accept"> + <arg name="time" type="uint"/> + <arg name="type" type="string"/> + </request> + + <request name="receive"> + <arg name="mime_type" type="string"/> + <arg name="fd" type="fd"/> + </request> + + <request name="destroy" type="destructor"/> + + <!-- Sent immediately after creating the wl_data_offer object. One + event per offered mime type. --> + <event name="offer"> + <arg name="type" type="string"/> + </event> + </interface> + + <interface name="wl_data_source" version="1"> + <!-- Add an offered mime type. Can be called several times to + offer multiple types. --> + <request name="offer"> + <arg name="type" type="string"/> + </request> + + <!-- Destroy the selection. --> + <request name="destroy" type="destructor"/> + + <!-- Sent when a target accepts pointer_focus or motion events. + If a target does not accept any of the offered types, type is + NULL --> + <event name="target"> + <arg name="mime_type" type="string"/> + </event> + + <!-- Request for data from another client. Send the data in the + specified mime-type over the passed fd, the close it. --> + <event name="send"> + <arg name="mime_type" type="string"/> + <arg name="fd" type="fd"/> + </event> + + <!-- Another selection became active. --> + <event name="cancelled"/> + </interface> + + <interface name="wl_data_device" version="1"> + <request name="start_drag"> + <arg name="source" type="object" interface="wl_data_source"/> + <arg name="surface" type="object" interface="wl_surface"/> + <arg name="time" type="uint"/> + </request> + + <request name="attach"> + <arg name="time" type="uint"/> + <arg name="buffer" type="object" interface="wl_buffer"/> + <arg name="x" type="int"/> + <arg name="y" type="int"/> + </request> + + <request name="set_selection"> + <arg name="source" type="object" interface="wl_data_source"/> + <arg name="time" type="uint"/> + </request> + + <event name="data_offer"> + <arg name="id" type="new_id" interface="wl_data_offer"/> + </event> + + <event name="enter"> + <arg name="time" type="uint"/> + <arg name="surface" type="object" interface="wl_surface"/> + <arg name="x" type="int"/> + <arg name="y" type="int"/> + <arg name="id" type="object" interface="wl_data_offer"/> + </event> + + <event name="leave"/> + + <event name="motion"> + <arg name="time" type="uint"/> + <arg name="x" type="int"/> + <arg name="y" type="int"/> + </event> + + <event name="drop"/> + + <event name="selection"> + <arg name="id" type="object" interface="wl_data_offer"/> + </event> + </interface> + + <interface name="wl_data_device_manager" version="1"> + <request name="create_data_source"> + <arg name="id" type="new_id" interface="wl_data_source"/> + </request> + + <request name="get_data_device"> + <arg name="id" type="new_id" interface="wl_data_device"/> + <arg name="input_device" type="object" interface="wl_input_device"/> + </request> + </interface> + <interface name="wl_shell" version="1"> <request name="move"> <arg name="surface" type="object" interface="wl_surface"/> @@ -184,14 +293,6 @@ <arg name="edges" type="uint"/> </request> - <request name="create_drag"> - <arg name="id" type="new_id" interface="wl_drag"/> - </request> - - <request name="create_selection"> - <arg name="id" type="new_id" interface="wl_selection"/> - </request> - <!-- Make the surface visible as a toplevel window. --> <request name="set_toplevel"> <arg name="surface" type="object" interface="wl_surface"/> @@ -240,145 +341,6 @@ </event> </interface> - <interface name="wl_selection" version="1"> - <!-- Add an offered mime type. Can be called several times to - offer multiple types, but must be called before 'activate'. --> - <request name="offer"> - <arg name="type" type="string"/> - </request> - - <!-- Can the selection be activated for multiple devices? --> - <request name="activate"> - <arg name="input_device" type="object" interface="wl_input_device"/> - <arg name="time" type="uint"/> - </request> - - <!-- Destroy the selection. --> - <request name="destroy" type="destructor"/> - - <!-- Another client pasted the selection, send the mime-type over - the passed fd. --> - <event name="send"> - <arg name="mime_type" type="string"/> - <arg name="fd" type="fd"/> - </event> - - <!-- Another selection became active. --> - <event name="cancelled"/> - </interface> - - <interface name="wl_selection_offer" version="1"> - <!-- Called to receive the selection data as the specified type. - Sends the pipe fd to the compositor, which forwards it to the - source in the 'send' event --> - <request name="receive"> - <arg name="mime_type" type="string"/> - <arg name="fd" type="fd"/> - </request> - - <!-- Sent before the keyboard_focus event to announce the types - offered. One event per offered mime type. A mime type of - NULL means the selection offer is going away. --> - <event name="offer"> - <arg name="type" type="string"/> - </event> - - <event name="keyboard_focus"> - <arg name="input_device" type="object" interface="wl_input_device"/> - </event> - </interface> - - <interface name="wl_drag" version="1"> - <!-- Add an offered mime type. Can be called several times to - offer multiple types, but must be called before 'activate'. --> - <request name="offer"> - <arg name="type" type="string"/> - </request> - - <request name="activate"> - <arg name="surface" type="object" interface="wl_surface"/> - <arg name="input_device" type="object" interface="wl_input_device"/> - <arg name="time" type="uint"/> - </request> - - <!-- Destroy the drag and cancel the session. --> - <request name="destroy" type="destructor"/> - - <!-- Sent when a target accepts pointer_focus or motion events. - If a target does not accept any of the offered types, type is - NULL --> - <event name="target"> - <arg name="mime_type" type="string"/> - </event> - - <!-- Sent when the drag is finished. The final mime type is that - of the last target event. If that was NULL, no drag target - was valid when the drag finished, fd is undefined and the - source should not send data. The event is also sent in case - a drag source tries to activate a drag after the grab was - released, in which case mime_type will also be NULL. --> - <event name="finish"> - <arg name="fd" type="fd"/> - </event> - - <event name="reject"/> - </interface> - - - <interface name="wl_drag_offer" version="1"> - <!-- Call to accept the offer of the given type --> - <request name="accept"> - <arg name="time" type="uint"/> - <arg name="type" type="string"/> - </request> - - <!-- Called to initiate the drag finish sequence. Sends the pipe - fd to the compositor, which forwards it to the source in the - 'finish' event --> - <request name="receive"> - <arg name="fd" type="fd"/> - </request> - - <!-- Called to reject a drop --> - <request name="reject"/> - - <!-- Sent before the pointer_focus event to announce the types - offered. One event per offered mime type. --> - <event name="offer"> - <arg name="type" type="string"/> - </event> - - <!-- Similar to device::pointer_focus. Sent to potential target - surfaces to offer drag data. If the device leaves the - window, the drag stops or the originator cancels the drag, - this event is sent with the NULL surface, at which point the - drag object may no longer be valid. --> - <event name="pointer_focus"> - <arg name="time" type="uint"/> - <arg name="surface" type="object" interface="wl_surface"/> - <arg name="x" type="int"/> - <arg name="y" type="int"/> - <arg name="surface_x" type="int"/> - <arg name="surface_y" type="int"/> - </event> - - <!-- Similar to device::motion. Sent to potential target surfaces - as the drag pointer moves around in the surface. --> - <event name="motion"> - <arg name="time" type="uint"/> - <arg name="x" type="int"/> - <arg name="y" type="int"/> - <arg name="surface_x" type="int"/> - <arg name="surface_y" type="int"/> - </event> - - <!-- Sent to indicate that the drag is finishing. The last - motion/pointer_focus event gives the location of the drop. - Target must respond with the 'receive' request, which sends - an fd to the source for writing the drag data. --> - <event name="drop"/> - </interface> - <!-- A surface. This is an image that is displayed on the screen. It has a location, size and pixel contents. Similar to a window. --> diff --git a/src/connection.c b/src/connection.c index 8c9a64d..f19280a 100644 --- a/src/connection.c +++ b/src/connection.c @@ -449,7 +449,7 @@ wl_connection_vmarshal(struct wl_connection *connection, closure->types[i] = &ffi_type_uint32; closure->args[i] = p; object = va_arg(ap, struct wl_object *); - *p++ = object->id; + *p++ = object ? object->id : 0; break; case 'a': @@ -493,6 +493,8 @@ wl_connection_vmarshal(struct wl_connection *connection, &dup_fd, sizeof dup_fd); break; default: + fprintf(stderr, "unhandled format code: '%c'\n", + message->signature[i - 2]); assert(0); break; } @@ -632,7 +634,7 @@ wl_connection_demarshal(struct wl_connection *connection, closure->types[i] = &ffi_type_uint32; closure->args[i] = p; object = wl_map_lookup(objects, *p); - if (*p == 0 || object != NULL) { + if (object != NULL) { printf("not a new object (%d), " "message %s(%s)\n", *p, message->name, message->signature); diff --git a/src/wayland-client.c b/src/wayland-client.c index c8bbe8f..939c17d 100644 --- a/src/wayland-client.c +++ b/src/wayland-client.c @@ -152,8 +152,9 @@ wl_proxy_create_for_id(struct wl_proxy *factory, proxy->object.interface = interface; proxy->object.implementation = NULL; - proxy->object.id = wl_map_insert_at(&display->objects, id, proxy); + proxy->object.id = id; proxy->display = display; + wl_map_insert_at(&display->objects, id, proxy); return proxy; } diff --git a/src/wayland-server.c b/src/wayland-server.c index 4811639..7c93e3f 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -874,3 +874,16 @@ wl_client_add_object(struct wl_client *client, return resource; } + +WL_EXPORT struct wl_resource * +wl_client_new_object(struct wl_client *client, + const struct wl_interface *interface, + const void *implementation, void *data) +{ + uint32_t id; + + id = wl_map_insert_new(&client->objects, WL_MAP_SERVER_SIDE, NULL); + return wl_client_add_object(client, + interface, implementation, id, data); + +} diff --git a/src/wayland-server.h b/src/wayland-server.h index 269a079..4de2e83 100644 --- a/src/wayland-server.h +++ b/src/wayland-server.h @@ -104,6 +104,10 @@ struct wl_resource * wl_client_add_object(struct wl_client *client, const struct wl_interface *interface, const void *implementation, uint32_t id, void *data); +struct wl_resource * +wl_client_new_object(struct wl_client *client, + const struct wl_interface *interface, + const void *implementation, void *data); struct wl_resource { struct wl_object object; @@ -176,39 +180,6 @@ struct wl_input_device { struct wl_listener grab_listener; }; -struct wl_drag_offer { - struct wl_resource resource; -}; - -struct wl_drag { - struct wl_resource resource; - struct wl_grab grab; - struct wl_drag_offer drag_offer; - struct wl_surface *source; - struct wl_surface *drag_focus; - struct wl_client *target; - int32_t x, y, sx, sy; - struct wl_array types; - const char *type; - uint32_t pointer_focus_time; - struct wl_listener drag_focus_listener; -}; - -struct wl_selection_offer { - struct wl_resource resource; -}; - -struct wl_selection { - struct wl_resource resource; - struct wl_client *client; - struct wl_input_device *input_device; - struct wl_selection_offer selection_offer; - struct wl_surface *selection_focus; - struct wl_client *target; - struct wl_array types; - struct wl_listener selection_focus_listener; -}; - void wl_resource_post_event(struct wl_resource *resource, uint32_t opcode, ...); void wl_resource_queue_event(struct wl_resource *resource, @@ -217,11 +188,6 @@ void wl_resource_post_error(struct wl_resource *resource, uint32_t code, const char *msg, ...); void wl_resource_post_no_memory(struct wl_resource *resource); -int -wl_display_set_compositor(struct wl_display *display, - struct wl_compositor *compositor, - const struct wl_compositor_interface *implementation); - void wl_display_post_frame(struct wl_display *display, struct wl_surface *surface, uint32_t msecs); @@ -287,11 +253,6 @@ wl_shm_init(struct wl_display *display, void wl_shm_finish(struct wl_shm *shm); -int -wl_compositor_init(struct wl_compositor *compositor, - const struct wl_compositor_interface *interface, - struct wl_display *display); - #ifdef __cplusplus } #endif |