@ -51,7 +51,7 @@ static void
data_offer_accept ( struct wl_client * client , struct wl_resource * resource ,
data_offer_accept ( struct wl_client * client , struct wl_resource * resource ,
uint32_t serial , const char * mime_type )
uint32_t serial , const char * mime_type )
{
{
struct wl_data_offer * offer = resource - > data ;
struct wl_data_offer * offer = wl_resource_get_user_data ( resource ) ;
/* FIXME: Check that client is currently focused by the input
/* FIXME: Check that client is currently focused by the input
* device that is currently dragging this data source . Should
* device that is currently dragging this data source . Should
@ -65,7 +65,7 @@ static void
data_offer_receive ( struct wl_client * client , struct wl_resource * resource ,
data_offer_receive ( struct wl_client * client , struct wl_resource * resource ,
const char * mime_type , int32_t fd )
const char * mime_type , int32_t fd )
{
{
struct wl_data_offer * offer = resource - > data ;
struct wl_data_offer * offer = wl_resource_get_user_data ( resource ) ;
if ( offer - > source )
if ( offer - > source )
offer - > source - > send ( offer - > source , mime_type , fd ) ;
offer - > source - > send ( offer - > source , mime_type , fd ) ;
@ -88,7 +88,7 @@ static const struct wl_data_offer_interface data_offer_interface = {
static void
static void
destroy_data_offer ( struct wl_resource * resource )
destroy_data_offer ( struct wl_resource * resource )
{
{
struct wl_data_offer * offer = resource - > data ;
struct wl_data_offer * offer = wl_resource_get_user_data ( resource ) ;
if ( offer - > source )
if ( offer - > source )
wl_list_remove ( & offer - > source_destroy_listener . link ) ;
wl_list_remove ( & offer - > source_destroy_listener . link ) ;
@ -117,23 +117,22 @@ wl_data_source_send_offer(struct wl_data_source *source,
if ( offer = = NULL )
if ( offer = = NULL )
return NULL ;
return NULL ;
wl_resource_init ( & offer - > resource , & wl_data_offer_interface ,
offer - > resource = wl_client_new_object ( wl_resource_get_client ( target ) ,
& data_offer_interface , 0 , offer ) ;
& wl_data_offer_interface ,
offer - > resource . destroy = destroy_data_offer ;
& data_offer_interface , offer ) ;
wl_resource_set_destructor ( offer - > resource , destroy_data_offer ) ;
offer - > source = source ;
offer - > source = source ;
offer - > source_destroy_listener . notify = destroy_offer_data_source ;
offer - > source_destroy_listener . notify = destroy_offer_data_source ;
wl_signal_add ( & source - > resource . destroy_signal ,
wl_signal_add ( & source - > destroy_signal ,
& offer - > source_destroy_listener ) ;
& offer - > source_destroy_listener ) ;
wl_client_add_resource ( target - > client , & offer - > resource ) ;
wl_data_device_send_data_offer ( target , offer - > resource ) ;
wl_data_device_send_data_offer ( target , & offer - > resource ) ;
wl_array_for_each ( p , & source - > mime_types )
wl_array_for_each ( p , & source - > mime_types )
wl_data_offer_send_offer ( & offer - > resource , * p ) ;
wl_data_offer_send_offer ( offer - > resource , * p ) ;
return & offer - > resource ;
return offer - > resource ;
}
}
static void
static void
@ -141,7 +140,7 @@ data_source_offer(struct wl_client *client,
struct wl_resource * resource ,
struct wl_resource * resource ,
const char * type )
const char * type )
{
{
struct wl_data_source * source = resource - > data ;
struct wl_data_source * source = wl_resource_get_user_data ( resource ) ;
char * * p ;
char * * p ;
p = wl_array_add ( & source - > mime_types , sizeof * p ) ;
p = wl_array_add ( & source - > mime_types , sizeof * p ) ;
@ -162,19 +161,6 @@ static struct wl_data_source_interface data_source_interface = {
data_source_destroy
data_source_destroy
} ;
} ;
static struct wl_resource *
find_resource ( struct wl_list * list , struct wl_client * client )
{
struct wl_resource * r ;
wl_list_for_each ( r , list , link ) {
if ( r - > client = = client )
return r ;
}
return NULL ;
}
static void
static void
drag_surface_configure ( struct weston_surface * es , int32_t sx , int32_t sy , int32_t width , int32_t height )
drag_surface_configure ( struct weston_surface * es , int32_t sx , int32_t sy , int32_t width , int32_t height )
{
{
@ -234,12 +220,12 @@ weston_drag_set_focus(struct weston_drag *drag, struct weston_surface *surface,
wl_resource_get_client ( surface - > resource ) ! = drag - > client )
wl_resource_get_client ( surface - > resource ) ! = drag - > client )
return ;
return ;
resource = find_resource ( & pointer - > seat - > drag_resource_list ,
resource = wl_resource_find_for_client ( & pointer - > seat - > drag_resource_list ,
wl_resource_get_client ( surface - > resource ) ) ;
wl_resource_get_client ( surface - > resource ) ) ;
if ( ! resource )
if ( ! resource )
return ;
return ;
display = wl_client_get_display ( resource - > client ) ;
display = wl_client_get_display ( wl_resource_get_client ( resource ) ) ;
serial = wl_display_next_serial ( display ) ;
serial = wl_display_next_serial ( display ) ;
if ( drag - > data_source )
if ( drag - > data_source )
@ -250,7 +236,7 @@ weston_drag_set_focus(struct weston_drag *drag, struct weston_surface *surface,
drag - > focus = surface ;
drag - > focus = surface ;
drag - > focus_listener . notify = destroy_drag_focus ;
drag - > focus_listener . notify = destroy_drag_focus ;
wl_signal_add ( & resource - > destroy_signal , & drag - > focus_listener ) ;
wl_resource_add_destroy_listener ( resource , & drag - > focus_listener ) ;
drag - > focus_resource = resource ;
drag - > focus_resource = resource ;
}
}
@ -397,9 +383,9 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
drag - > client = client ;
drag - > client = client ;
if ( source_resource ) {
if ( source_resource ) {
drag - > data_source = source_resource - > data ;
drag - > data_source = wl_resource_get_user_data ( source_resource ) ;
drag - > data_source_listener . notify = destroy_data_device_source ;
drag - > data_source_listener . notify = destroy_data_device_source ;
wl_signal_add ( & source_resource - > destroy_signal ,
wl_resource_add_destroy_listener ( source_resource ,
& drag - > data_source_listener ) ;
& drag - > data_source_listener ) ;
}
}
@ -431,8 +417,8 @@ destroy_selection_data_source(struct wl_listener *listener, void *data)
if ( seat - > keyboard )
if ( seat - > keyboard )
focus = seat - > keyboard - > focus_resource ;
focus = seat - > keyboard - > focus_resource ;
if ( focus ) {
if ( focus ) {
data_device = find_resource ( & seat - > drag_resource_list ,
data_device = wl_resource_find_for_client ( & seat - > drag_resource_list ,
focus - > client ) ;
wl_resource_get_client ( focus ) ) ;
if ( data_device )
if ( data_device )
wl_data_device_send_selection ( data_device , NULL ) ;
wl_data_device_send_selection ( data_device , NULL ) ;
}
}
@ -463,8 +449,8 @@ weston_seat_set_selection(struct weston_seat *seat,
if ( seat - > keyboard )
if ( seat - > keyboard )
focus = seat - > keyboard - > focus_resource ;
focus = seat - > keyboard - > focus_resource ;
if ( focus ) {
if ( focus ) {
data_device = find_resource ( & seat - > drag_resource_list ,
data_device = wl_resource_find_for_client ( & seat - > drag_resource_list ,
focus - > client ) ;
wl_resource_get_client ( focus ) ) ;
if ( data_device & & source ) {
if ( data_device & & source ) {
offer = wl_data_source_send_offer ( seat - > selection_data_source ,
offer = wl_data_source_send_offer ( seat - > selection_data_source ,
data_device ) ;
data_device ) ;
@ -479,7 +465,7 @@ weston_seat_set_selection(struct weston_seat *seat,
if ( source ) {
if ( source ) {
seat - > selection_data_source_listener . notify =
seat - > selection_data_source_listener . notify =
destroy_selection_data_source ;
destroy_selection_data_source ;
wl_signal_add ( & source - > resource . destroy_signal ,
wl_signal_add ( & source - > destroy_signal ,
& seat - > selection_data_source_listener ) ;
& seat - > selection_data_source_listener ) ;
}
}
}
}
@ -493,7 +479,8 @@ data_device_set_selection(struct wl_client *client,
return ;
return ;
/* FIXME: Store serial and check against incoming serial here. */
/* FIXME: Store serial and check against incoming serial here. */
weston_seat_set_selection ( resource - > data , wl_resource_get_user_data ( source_resource ) ,
weston_seat_set_selection ( wl_resource_get_user_data ( resource ) ,
wl_resource_get_user_data ( source_resource ) ,
serial ) ;
serial ) ;
}
}
@ -505,37 +492,38 @@ static const struct wl_data_device_interface data_device_interface = {
static void
static void
destroy_data_source ( struct wl_resource * resource )
destroy_data_source ( struct wl_resource * resource )
{
{
struct wl_data_source * source =
struct wl_data_source * source = wl_resource_get_user_data ( resource ) ;
container_of ( resource , struct wl_data_source , resource ) ;
char * * p ;
char * * p ;
wl_signal_emit ( & source - > destroy_signal , source ) ;
wl_array_for_each ( p , & source - > mime_types )
wl_array_for_each ( p , & source - > mime_types )
free ( * p ) ;
free ( * p ) ;
wl_array_release ( & source - > mime_types ) ;
wl_array_release ( & source - > mime_types ) ;
source - > resource . object . id = 0 ;
source - > resource = NULL ;
}
}
static void
static void
client_source_accept ( struct wl_data_source * source ,
client_source_accept ( struct wl_data_source * source ,
uint32_t time , const char * mime_type )
uint32_t time , const char * mime_type )
{
{
wl_data_source_send_target ( & source - > resource , mime_type ) ;
wl_data_source_send_target ( source - > resource , mime_type ) ;
}
}
static void
static void
client_source_send ( struct wl_data_source * source ,
client_source_send ( struct wl_data_source * source ,
const char * mime_type , int32_t fd )
const char * mime_type , int32_t fd )
{
{
wl_data_source_send_send ( & source - > resource , mime_type , fd ) ;
wl_data_source_send_send ( source - > resource , mime_type , fd ) ;
close ( fd ) ;
close ( fd ) ;
}
}
static void
static void
client_source_cancel ( struct wl_data_source * source )
client_source_cancel ( struct wl_data_source * source )
{
{
wl_data_source_send_cancelled ( & source - > resource ) ;
wl_data_source_send_cancelled ( source - > resource ) ;
}
}
static void
static void
@ -550,21 +538,23 @@ create_data_source(struct wl_client *client,
return ;
return ;
}
}
wl_resource_init ( & source - > resource , & wl_data_source_interface ,
wl_signal_init ( & source - > destroy_signal ) ;
& data_source_interface , id , source ) ;
source - > resource . destroy = destroy_data_source ;
source - > accept = client_source_accept ;
source - > accept = client_source_accept ;
source - > send = client_source_send ;
source - > send = client_source_send ;
source - > cancel = client_source_cancel ;
source - > cancel = client_source_cancel ;
wl_array_init ( & source - > mime_types ) ;
wl_array_init ( & source - > mime_types ) ;
wl_client_add_resource ( client , & source - > resource ) ;
source - > resource = wl_client_add_object ( client ,
& wl_data_source_interface ,
& data_source_interface ,
id , source ) ;
wl_resource_set_destructor ( source - > resource , destroy_data_source ) ;
}
}
static void unbind_data_device ( struct wl_resource * resource )
static void unbind_data_device ( struct wl_resource * resource )
{
{
wl_list_remove ( & resource - > link ) ;
wl_list_remove ( wl_resource_get_link ( resource ) ) ;
free ( resource ) ;
free ( resource ) ;
}
}
@ -580,8 +570,8 @@ get_data_device(struct wl_client *client,
& data_device_interface , id ,
& data_device_interface , id ,
seat ) ;
seat ) ;
wl_list_insert ( & seat - > drag_resource_list , & resource - > link ) ;
wl_list_insert ( & seat - > drag_resource_list , wl_resource_get_link ( resource ) ) ;
resource - > destroy = unbind_data_device ;
wl_resource_set_destructor ( resource , unbind_data_device ) ;
}
}
static const struct wl_data_device_manager_interface manager_interface = {
static const struct wl_data_device_manager_interface manager_interface = {
@ -610,8 +600,8 @@ wl_data_device_set_keyboard_focus(struct weston_seat *seat)
if ( ! focus )
if ( ! focus )
return ;
return ;
data_device = find_resource ( & seat - > drag_resource_list ,
data_device = wl_resource_find_for_client ( & seat - > drag_resource_list ,
focus - > client ) ;
wl_resource_get_client ( focus ) ) ;
if ( ! data_device )
if ( ! data_device )
return ;
return ;